四个分散的1也可以消除
10
1 2 2 1 3 3 1 4 4 1
正确输出应为3(先消2,再消4,最后消3,1也随之消除),但题解输出为5。这个特判用另一个二维数组把三个1的情况的最小值存下来就可以了。
这是我的程序
#include<bits/stdc++.h>
using namespace std;
int ss,lth[1010],s[1010],f[1010][1010],z[1010][1010];
int main(){
cin>>ss;
for(int i=1;i<=ss;i++){
scanf("%d",<h[i]);
if(lth[i]==lth[i-1]&&(i!=1||s[i-1]!=0)) i--,ss--;
s[i]++;
}
for(int i=1;i<=ss;i++) for(int j=1;j<=ss;j++) f[i][j]=z[i][j]=0x3f3f3f3f;
for(int i=1;i<=ss;i++){
if(s[i]>=2) f[i][i]=1;
else f[i][i]=2;
}
for(int l=2;l<=ss;l++) for(int i=1;i<=ss;i++){
int j=l+i-1;
if(j>ss) continue;
for(int k=i;k<j;k++) f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
if(l==2) continue;
if(lth[i]==lth[j]&&min(s[i],s[j])==1) for(int k=i+2;k<j-1;k++) if(lth[k]==lth[i]&&s[k]==1){
f[i][j]=min(f[i][j],z[i][k]+f[k+1][j-1]),f[i][j]=min(f[i][j],f[i+1][k-1]+f[k+1][j-1]);//特判(1+1)+(1+1)与(1+1)+n或n+(1+1)的情况(n为任意正整数)
if(s[i]==1&&s[j]==1) z[i][j]=min(z[i][j],f[i+1][k-1]+f[k+1][j-1]);//存入(1+1)+1的情况
}
if(lth[i]==lth[j]&&s[i]+s[j]>2) f[i][j]=min(f[i][j],f[i+1][j-1]);
else if(lth[i]==lth[j]) f[i][j]=min(f[i][j],f[i+1][j-1]+1);
}
cout<<f[1][ss]<<endl;
return 0;
}
这个程序过不了T6~T9,可能是因为数据有误。