【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)中的 ...
随机推荐
- allocator例子
13.39 编写自己的StrVec,包括自己版本的reserve.capacity和resize. 13.40 为StrVec添加一个构造函数,它接受一个initializer_list<str ...
- Day05 - Python 常用模块
1. 模块简介 模块就是一个保存了 Python 代码的文件.模块能定义函数,类和变量.模块里也能包含可执行的代码. 模块也是 Python 对象,具有随机的名字属性用来绑定或引用. 下例是个简单的模 ...
- 一个基于MVVM的TableView组件化实现方案
AITableView https://github.com/chentoo/AITableView cocoapods: pod ‘AITableView’ 做什么用? 这是一个简化UITableV ...
- JavaScript判断数据类型总结
最近做项目中遇到了一些关于javascript数据类型的判断处理,上网找了一下资料,并且亲自验证了各种数据类型的判断网页特效,在此做一个总结吧! 一.JS中的数据类型 1.数值型(Number):包 ...
- Linux下Tomcat安装、配置
/etc/profile./etc/profile.d和.bash_profile区别 /etc/profile和/etc/profile.d区别 .bash_profile 是存放用户的全局变量 / ...
- Bootstrap--全局css样式之表单
单独的表单控件会被自动赋予一些全局样式.所有设置了 .form-control 类的 <input>.<textarea> 和 <select> 元素都将被默认设置 ...
- 《转载》CSS中的三种样式来源:创作人员、读者和用户代理
CSS中的样式一共有三种来源:创作人员.读者和用户代理,来源的不同会影响到样式的层叠方式,很多第一次学习CSS的朋友,对这三种来源可能会存在一些困惑,下面我写一下自己的理解,若有错误的地方还请指正. ...
- js基础知识之_流程控制语句
javascript 流程控制 流程控制:就是程序代码执行顺序 流程控制:通过规定的语句让程序代码有条件的按照一定的方式执行 顺序结构 按照书写顺序来执行,是程序中最基本的流程结构 选择结构(分支结构 ...
- OC细节 - 1.深拷贝与浅拷贝详解
概述 拷贝:复制一个与源对象内容相同的对象 实现拷贝,需要遵守以下两个协议 NSCopying NSMutableCopying 拷贝返回对象的种类 可变,mutableCopy消息返回的对象 不可变 ...
- 前端开发构建工具gulp的安装使用
曾几何时还在使用grunt作为前端的构建工具,直到有一天同事向我推荐了gulp,在这里博主将不讨论gulp与grunt各自优势的比较,只为大家介绍gulp如何安装和使用. Gulp 是用 nodejs ...