【UVA1579】俄罗斯套娃 Matryoshka (动态规划)
题目:
分析:
其实就是两个dp结合起来。第一个dp求区间[l,r]全部合并起来要用的最小次数,可以用区间[l,k]&[k+1,r]转移(l<=k<r)。第二个dp求前i个娃娃分成多个套娃组最小合并次数。这两个动态规划都是很常规的。
我们考虑一个问题:怎样的区间才能弄成一个套娃组(即为1~p的互不相同的数)呢?其实只要保证这个区间的数互不相同且max值为len即可。
对于要合并的两个区间[l,k]&[k+1,r],最后一步把他们合并的费用是多少呢?假设m1=min[l,k],m2=min[k+1,r],则不用打开的套娃数为这个区间中小于max(m1,m2)的数的个数。(这个也很好理解)
然而我想不到很好的处理的方法,本题数据规模是n<=500,总感觉会超时,然而却AC了~~
代码如下:(有点恶心~~~)
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 510
#define INF 0xfffffff int n;
int a[Maxn],mx[Maxn][Maxn],mn[Maxn][Maxn];
bool p[Maxn][Maxn];
int dp[Maxn][Maxn],f[Maxn],nt[Maxn],first[Maxn]; int mymax(int x,int y) {return x>y?x:y;}
int mymin(int x,int y) {return x<y?x:y;} struct node
{
int id,x;
};//t[Maxn]; bool cmp(node x,node y) {return x.x<y.x;} void init()
{
memset(first,,sizeof(first));
memset(p,,sizeof(p));
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
nt[i]=first[a[i]];first[a[i]]=i;
}
memset(mn,,sizeof(mn));
for(int i=;i<=n;i++) mx[i][i]=mn[i][i]=a[i],p[i][i]=;
for(int i=n;i>=;i--)
for(int j=i+;j<=n;j++)
{
mx[i][j]=mymax(mx[i][j-],a[j]);
mn[i][j]=mymin(mn[i][j-],a[j]);
if(p[i][j-]&&nt[j]<i) p[i][j]=;
}
} int ddp(int x,int y)
{
if(dp[x][y]<) return dp[x][y];
if(x==y) {dp[x][y]=;return ;}
int num;
node t[Maxn];
for(int i=x;i<=y;i++) t[i-x+].x=a[i],t[i-x+].id=i;
sort(t+,t++y-x+,cmp);
for(int i=x;i<y;i++)
{
int mm=mymax(mn[x][i],mn[i+][y]);
num=;
for(int j=;j<=y-x+;j++)
{
if(t[j].x==mm) break;
if(t[j].x<mm) num++;
}
num=y-x+-num;
dp[x][y]=mymin(dp[x][y],ddp(x,i)+ddp(i+,y)+num);
}
return dp[x][y];
} void ffind()
{
memset(dp,,sizeof(dp));
memset(f,,sizeof(f));
for(int i=;i<=n;i++)
for(int j=i;j<=n;j++)
{
if(mx[i][j]==j-i+&&p[i][j])
ddp(i,j);
}
f[]=;
for(int i=;i<=n;i++)
for(int j=;j<i;j++) if(mx[j+][i]==i-j&&p[j+][i])
{
f[i]=mymin(f[i],f[j]+dp[j+][i]);
}
if(f[n]>) printf("impossible\n");
else printf("%d\n",f[n]);
} int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
ffind();
}
return ;
}
uva1579
2016-03-08 13:32:04
【UVA1579】俄罗斯套娃 Matryoshka (动态规划)的更多相关文章
- UVA-1579 Matryoshka (区间DP)
题目大意:n个俄罗斯套娃,都有相应的编号,每次可将两个相邻的套娃组合成一组,每次合成只能小的放到大的里面,并且是逐层嵌套.问将这n个套娃分成若干个组,并且每组都是编号从1开始的连续序列,最少需要几步. ...
- 清晰明了的javascript版动态规划
算法是一种艺术,给人感觉很不好接近,但是一旦你和ta熟络了,你就能发现这门艺术的内在是多么美妙且多变. 对于前端来说,算法也许不是最重要的,在日常工作中,几乎很少用到.所以很多人也不是很感冒. 不过呢 ...
- leetcode 354. 俄罗斯套娃信封问题(二维排序有关)
题目描述 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现.当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样. 请计算最多能有 ...
- C#LeetCode刷题-动态规划
动态规划篇 # 题名 刷题 通过率 难度 5 最长回文子串 22.4% 中等 10 正则表达式匹配 18.8% 困难 32 最长有效括号 23.3% 困难 44 通配符匹配 17.7% ...
- LeetCode刷题总结-动态规划篇
本文总结LeetCode上有动态规划的算法题,推荐刷题总数为54道.具体考点分析如下图: 1.中心扩展法 题号:132. 分割回文串 II,难度困难 2.背包问题 题号:140. 单词拆分 II,难度 ...
- 【NOIP2015模拟11.5】JZOJ8月5日提高组T1 俄罗斯套娃
[NOIP2015模拟11.5]JZOJ8月5日提高组T1 俄罗斯套娃 题目 题解 题意就是说 将1~\(n\)排列,问有多少种方案使得序列的逆序对个数小于\(k\) 很容易想到DP 设\(f[i][ ...
- leetcode动态规划题目总结
Hello everyone, I am a Chinese noob programmer. I have practiced questions on leetcode.com for 2 yea ...
- LeetCode:动态规划
动态规划 动态规划永远的神 这部分主要是学习了 labuladong 公众号中对于动态规划的讲解 刷了些 leetcode 题,在此做一些记录,不然没几天就忘光光了 题目 这部分内容直接上题目了,解题 ...
- 增强学习(三)----- MDP的动态规划解法
上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...
随机推荐
- a标签中的href="#"与href="javascript:void(0)"区别
转自http://blog.csdn.net/fightplane/article/details/5190037 <a href="#"> 点击链接后,页面会向上滚到 ...
- Hibernate占位符警告:use named parameters or JPA-style positional parameters instead.
Hibernate占位符警告:use named parameters or JPA-style positional parameters instead. >>>>> ...
- boost.log要点笔记
span.kw { color: #007020; font-weight: bold; } code > span.dt { color: #902000; } code > span. ...
- Python教程:连接数据库,对数据进行增删改查操作
各位志同道合的同仁可以点击上方关注↑↑↑↑↑↑ 本教程致力于程序员快速掌握Python语言编程. 本文章内容是基于上次课程Python教程:操作数据库,MySql的安装详解 和python基础知识之上 ...
- 用Module元素实现SharePoint Webpart Page的自动生成
最近研发的项目中开发了很多的WebPart,每次部署这些WebPart到新环境中总是很麻烦,因为自己要新创建WebpartPage,同时还要把这些WebPart放到指定的WebPart页中去: 为了方 ...
- 8第八章CTE递归及分组汇总高级部分(多维数据集)(转载)
8第八章CTE递归及分组汇总高级部分(多维数据集) 这里贴图太麻烦...算了 UNION 等集合操作符: UNION 等以第一个 SELECT 的 列明 作为 整个结果集的列明,整个结果集 唯一认可 ...
- iBATIS缓存cacheModel属性浅析
iBATIS缓存cacheModel属性的应用使得在Mapped Statement中缓存常用的数据,那么本文将会给你介绍iBATIS缓存cacheModel属性的信息. AD:2013云计算架构师峰 ...
- JavaScript Invalid Date Verify
if ( Object.prototype.toString.call(d) === "[object Date]" ) { // it is a date if ( isNaN( ...
- nullptr和NULL 区别
注:本文内容摘自网络,准确性有待验证,现阶段仅供学习参考.尊重作品作者成果,原文链接 :http://www.2cto.com/kf/201302/190008.html 1.为什要有nullptr ...
- android code 和js的交互
小弟现在需要android code 和js的交互.出现了问题,求大家带一带啊. 我的页面:<!DOCTYPE html><html lang="en">& ...