首页 > 其他 > 详细

[bzoj1032]祖码

时间:2019-10-27 15:21:39      阅读:73      评论:0      收藏:0      [点我收藏+]

先将连续的一段相同的点连起来,然后考虑对于一段区间,分两种情况:
1.首尾两点再同时消掉,必然要先将去掉首尾的一段消掉后再消
2.首尾两点再不同时刻消掉,那么必然存在一个断点k,使得k左右无关
(题目中的错误指的是某一段和相同颜色的另一段因消除而合并时暂时不消掉,这在祖玛游戏中是不被允许的,因此并无错误)

根据以上情况,区间dp即可

技术分享图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct ji{
 4     int x,s;
 5 }a[505];
 6 int n,m,k,f[505][505];
 7 int main(){
 8     scanf("%d",&n);
 9     for(int i=1;i<=n;i++){
10         scanf("%d",&k);
11         if ((i==1)||(k!=a[m].x))a[++m].x=k;
12         a[m].s++;
13     }
14     memset(f,0x3f,sizeof(f));
15     for(int i=1;i<=m;i++)f[i][i]=1+(a[i].s==1);
16     for(int i=m;i;i--)
17         for(int j=i+1;j<=m;j++){
18             if (a[i].x==a[j].x)f[i][j]=f[i+1][j-1]+(a[i].s+a[j].s==2);
19             for(int k=i;k<j;k++)f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
20         }
21     printf("%d",f[1][m]);
22 }
View Code

 

[bzoj1032]祖码

原文:https://www.cnblogs.com/PYWBKTDA/p/11747535.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!