题意:字符串的压缩,f[l][r][0]代表还没M,f[l][r][1]代表有M。
1 #include<cstdio> 2 #include<cmath> 3 #include<cstring> 4 #include<algorithm> 5 #include<iostream> 6 int f[55][55][2],n; 7 char s[555]; 8 bool ok(int l,int r){ 9 int len=(r-l+1)/2; 10 for (int i=1;i<=len;i++) 11 if (s[l+i-1]!=s[l+len-1+i]) return 0; 12 return 1; 13 } 14 int dp(int l,int r,int id){ 15 if (f[l][r][id]!=-1) return f[l][r][id]; 16 f[l][r][id]=r-l+1; 17 if (l==r) return f[l][r][id]=1; 18 int x=r-l+1,len=x; 19 if (id) 20 for (int i=l;i<r;i++) x=std::min(x,dp(l,i,1)+1+dp(i+1,r,1)); 21 for (int i=l;i<r;i++) x=std::min(x,dp(l,i,id)+r-i); 22 if (len%2==0&&ok(l,r)) 23 x=std::min(x,dp(l,l+len/2-1,0)+1); 24 return f[l][r][id]=x; 25 } 26 int main(){ 27 scanf("%s",s+1); 28 int n=strlen(s+1); 29 for (int i=1;i<=n;i++) 30 for (int j=1;j<=n;j++) 31 for (int k=0;k<=1;k++) 32 f[i][j][k]=-1; 33 printf("%d\n",dp(1,n,1)); 34 }
时间: 2024-10-07 06:29:09