UVA-1579 Matryoshka (区间DP)
题目大意:n个俄罗斯套娃,都有相应的编号,每次可将两个相邻的套娃组合成一组,每次合成只能小的放到大的里面,并且是逐层嵌套。问将这n个套娃分成若干个组,并且每组都是编号从1开始的连续序列,最少需要几步。
题目分析:很显然的区间DP,只不过每次DP未必是在整个区间,而是在子区间上。
代码如下:
# include<iostream>
# include<cstdio>
# include<queue>
# include<cstring>
# include<algorithm>
using namespace std; const int INF=1000000000; int a[505];
int n,vis[505];
int dp[505][505]; int getStep(int l1,int r1,int l2,int r2)
{
priority_queue<int>q1,q2;
for(int i=l1;i<=r1;++i) q1.push(a[i]);
for(int i=l2;i<=r2;++i) q2.push(a[i]);
int res=0;
while(!q1.empty()&&!q2.empty()){
int t1=q1.top();
int t2=q2.top();
++res;
if(t1>t2) q1.pop();
else q2.pop();
}
return res;
} int dfs(int l,int r)
{
if(dp[l][r]!=-1) return dp[l][r];
if(l==r) return dp[l][r]=0;
dp[l][r]=INF;
for(int i=l+1;i<=r;++i){
int step=getStep(l,i-1,i,r);
dp[l][r]=min(dp[l][r],dfs(l,i-1)+dfs(i,r)+step);
}
return dp[l][r];
} int solve()
{
int l=0,ans=0;
memset(dp,-1,sizeof(dp));
memset(vis,0,sizeof(vis));
vis[a[0]]=1;
for(int i=1;i<n;++i){
if(vis[a[i]]){
for(int j=1;j<=i-l;++j)
if(!vis[j]) return INF;
ans+=dfs(l,i-1);
memset(vis,0,sizeof(vis));
vis[a[i]]=1;
l=i;
//cout<<i<<' '<<a[i]<<endl;
}else
vis[a[i]]=1;
}
for(int i=1;i<=n-l;++i) if(!vis[i]) return INF;
ans+=dfs(l,n-1);
return ans;
} int main()
{
while(~scanf("%d",&n))
{
for(int i=0;i<n;++i) scanf("%d",a+i);
int ans=solve();
if(ans==INF) printf("impossible\n");
else printf("%d\n",ans);
}
return 0;
}
UVA-1579 Matryoshka (区间DP)的更多相关文章
- hdu 4597 + uva 10891(一类区间dp)
题目链接:http://vjudge.net/problem/viewProblem.action?id=19461 思路:一类经典的博弈类区间dp,我们令dp[l][r]表示玩家A从区间[l, r] ...
- UVA - 1632 Alibaba (区间dp+常数优化)
题目链接 设$dp[l][r][p]$为走完区间$[l,r]$,在端点$p$时所需的最短时间($p=0$代表在左端点,$p=1$代表在右端点) 根据题意显然有状态转移方程$\left\{\begin{ ...
- UVA 10559 Blocks——区间dp
题目:https://www.luogu.org/problemnew/show/UVA10559 应该想到区间dp.但怎么设计状态? 因为连续的东西有分值,所以应该记录一下连续的有多少个. 只要记录 ...
- UVA 10559 Blocks —— 区间DP
题目:https://www.luogu.org/problemnew/show/UVA10559 区间DP,有点难想: 为了方便,先把原来就是连续一段相同颜色的点看做一个点,记一下长度: f[i][ ...
- UVA - 1632 Alibaba 区间dp
题意:给定n个点,其中第i个点的坐标是,且它会在秒后消失.Alibaba可以从任意位置出发,求访问完所有点的最短时间.无解输出No solution. 思路:表示访问完区间后停留在i点的最短时间,表示 ...
- UVA 10559 Blocks(区间DP&&递推)
题目大意:给你玩一个一维版的消灭星星,得分是当前消去的区间的长度的平方,求最大得分. 现在分析一下题目 因为得分是长度的平方,不能直接累加,所以在计算得分时需要考虑前一个状态所消去的长度,仅用dp[l ...
- UVa 1630 Folding (区间DP)
题意:折叠一个字符串,使得其成为一个尽量短的字符串 例如AAAAAA变成6(A) 而且这个折叠是可以嵌套的,例如 NEEEEERYESYESYESNEEEEERYESYESYES 会变成 2(N5( ...
- BZOJ 1260&UVa 4394 区间DP
题意: 给一段字符串成段染色,问染成目标串最少次数. SOL: 区间DP... DP[i][j]表示从i染到j最小代价 转移:dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k ...
- Uva 10891 经典博弈区间DP
经典博弈区间DP 题目链接:https://uva.onlinejudge.org/external/108/p10891.pdf 题意: 给定n个数字,A和B可以从这串数字的两端任意选数字,一次只能 ...
- 区间DP+next求循环节 uva 6876
// 区间DP+next求循环节 uva 6876 // 题意:化简字符串 并表示出来 // 思路:dp[i][j]表示 i到j的最小长度 // 分成两部分 再求一个循环节 #include < ...
随机推荐
- Python入门之Pycharm开发中最常用快捷键
要查阅Pycharm的快捷键,当然要看官方文档,https://www.jetbrains.com/help/pycharm/mastering-keyboard-shortcuts.html 编辑类 ...
- ORM 关系对象映射 基础知识点
优点: 1.ORM使我们通用的数据库变得更加的简单便捷. 2.可避免新手程序员写sql语句带来的性能问题. 1. 创建单表 2. 创建关键表 1). 一对一 2). 一对多 3). 多对多 创建表的语 ...
- 实现windows命令提示符的tab补全
1:使用win+r打开 运行 控制台 2:输入 regedit 打开注册表 3:进入 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\C ...
- Python3基础 help 查看内置函数说明
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Bootloader之uBoot简介
本文转载自:http://blog.ednchina.com/hhuwxf/1915416/message.aspx 一.Bootloader的引入 从前面的硬件实验可以知道,系统上电之后,需要一段程 ...
- P2894 [USACO08FEB]酒店Hotel 线段树
题目大意 多次操作 查询并修改区间内长度==len的第一次出现位置 修改区间,变为空 思路 类似于求区间最大子段和(应该是这个吧,反正我没做过) 维护区间rt的 从l开始向右的最长长度 从r开始向左的 ...
- POJ1144 Network(割点)题解
Description A Telephone Line Company (TLC) is establishing a new telephone cable network. They are c ...
- Linux deepin 中Jetbrain Idea等软件中文显示异常
解决方案:安装常用的中文字体 # 文鼎宋体[推荐] sudo apt install fonts-arphic-uming # 文鼎楷体[推荐] sudo apt install fonts-arph ...
- Avito Cool Challenge 2018
考挂了.. A - Definite Game 直接看代码吧. #include<cstdio> #include<cstring> #include<algorithm ...
- MariaDB / MySQL数据类型
MariaDB / MySQL 数据类型 有三种主要的类型:Text(文本).Number(数字)和 Date/Time(日期/时间)类型. Text 类型: 数据类型 描述 CHAR(size) 保 ...