先将连续的一段相同的点连起来,然后考虑对于一段区间,分两种情况:
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 }