题目大意: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)的更多相关文章

  1. hdu 4597 + uva 10891(一类区间dp)

    题目链接:http://vjudge.net/problem/viewProblem.action?id=19461 思路:一类经典的博弈类区间dp,我们令dp[l][r]表示玩家A从区间[l, r] ...

  2. UVA - 1632 Alibaba (区间dp+常数优化)

    题目链接 设$dp[l][r][p]$为走完区间$[l,r]$,在端点$p$时所需的最短时间($p=0$代表在左端点,$p=1$代表在右端点) 根据题意显然有状态转移方程$\left\{\begin{ ...

  3. UVA 10559 Blocks——区间dp

    题目:https://www.luogu.org/problemnew/show/UVA10559 应该想到区间dp.但怎么设计状态? 因为连续的东西有分值,所以应该记录一下连续的有多少个. 只要记录 ...

  4. UVA 10559 Blocks —— 区间DP

    题目:https://www.luogu.org/problemnew/show/UVA10559 区间DP,有点难想: 为了方便,先把原来就是连续一段相同颜色的点看做一个点,记一下长度: f[i][ ...

  5. UVA - 1632 Alibaba 区间dp

    题意:给定n个点,其中第i个点的坐标是,且它会在秒后消失.Alibaba可以从任意位置出发,求访问完所有点的最短时间.无解输出No solution. 思路:表示访问完区间后停留在i点的最短时间,表示 ...

  6. UVA 10559 Blocks(区间DP&&递推)

    题目大意:给你玩一个一维版的消灭星星,得分是当前消去的区间的长度的平方,求最大得分. 现在分析一下题目 因为得分是长度的平方,不能直接累加,所以在计算得分时需要考虑前一个状态所消去的长度,仅用dp[l ...

  7. UVa 1630 Folding (区间DP)

    题意:折叠一个字符串,使得其成为一个尽量短的字符串  例如AAAAAA变成6(A) 而且这个折叠是可以嵌套的,例如 NEEEEERYESYESYESNEEEEERYESYESYES 会变成 2(N5( ...

  8. 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 ...

  9. Uva 10891 经典博弈区间DP

    经典博弈区间DP 题目链接:https://uva.onlinejudge.org/external/108/p10891.pdf 题意: 给定n个数字,A和B可以从这串数字的两端任意选数字,一次只能 ...

  10. 区间DP+next求循环节 uva 6876

    // 区间DP+next求循环节 uva 6876 // 题意:化简字符串 并表示出来 // 思路:dp[i][j]表示 i到j的最小长度 // 分成两部分 再求一个循环节 #include < ...

随机推荐

  1. cojs 强连通图计数1-2 题解报告

    OwO 题目含义都是一样的,只是数据范围扩大了 对于n<=7的问题,我们直接暴力搜索就可以了 对于n<=1000的问题,我们不难联想到<主旋律>这一道题 没错,只需要把方程改一 ...

  2. 03: zabbix API接口 对 主机、主机组、模板、应用集、监控项、触发器等增删改查

    目录:Django其他篇 01: 安装zabbix server 02:zabbix-agent安装配置 及 web界面管理 03: zabbix API接口 对 主机.主机组.模板.应用集.监控项. ...

  3. 解决mysql的Too many connections

    解决: /etc/my.cnf vim编辑 添加 max_connections= wait_timeout= 然后执行code service mysqld reload service mysql ...

  4. 20145311王亦徐《网络对抗技术》MAL_逆向与Bof基础

    20145311王亦徐<网络对抗技术>MAL_逆向与Bof基础 实践目标 运行一个可执行文件,通过逆向或者Bof技术执行原本不应该执行的代码片段采用的两种方法: 1.利用foo函数的Bof ...

  5. 关于Qt跨线程调用IO子类的理解

    一.疑问 突然想到,类似于QTcpsocket和QSerialport这类对象,如果是在A线程中new的,那就不能在其他线程中访问.我一般是这样做的: 封装一个QObject子类,放这些对象进去,然后 ...

  6. JavaScript callee caller

    caller是function的属性 callee是arguments的属性 callee:返回正在执行的函数对象. var sum = function (n) { == n) ; ); } con ...

  7. LeetCode——Maximum Binary Tree

    Question Given an integer array with no duplicates. A maximum tree building on this array is defined ...

  8. 利用Ajax和Servlet实现输入框提示功能

    目的和效果:     输入框输入字符串x,匹配后台传入的数据str,如果str中的元素包含字符串x,则提示. 后台代码:                   String x = request.ge ...

  9. ubuntu 16.04 u盘挂载以及卸载

    1.列出所有磁盘 sudo fdisk -l 2.最后一段信息显示的为u盘 Device Boot Start End Sectors Size Id Type /dev/sdb4 * 256 786 ...

  10. Spring 注解 @Resource和@Autowired

    @Resource和@Autowired两者都是做bean的注入使用. 其实@Resource并不是Spring的注解,他的包是javax.annotation.Resource 需要导入.但是Spr ...