一道区间dp。
套路f[i][j],来表示,考虑转移。
首先很好想到的是,如果不改变颜色,f[i][j]=min(f[i][k],f[k+1][j])毫无疑问。那么如果要换颜色呢。显然此时转移要s[i]与s[j]相等(不然没意义),f[i][j]=f[p][q]+1,s[p]==s[q],然后各路dalao说f[i][j]=Min(f[i+1][j],f[i][j-1],f[i+1][j-1]+1),一样可以达到效果,自己再想想吧。
#include<bits/stdc++.h>
#define N 100
#define Min(x,y,z) min(x,min(y,z))
using namespace std;
int n;
int f[N+1][N+1];
char s[N+1];
int main()
{
// freopen("in.txt","r",stdin);
gets(s+1);n=strlen(s+1);
memset(f,63,sizeof(f));
for(int l=0;l<=n;l++)
{
for(int i=1;i<=n;i++)
{
int j=i+l;if(j>n)break;
if(s[i]==s[j])
{
if(l<=1)f[i][j]=1;
else f[i][j]=Min(f[i+1][j],f[i][j-1],f[i+1][j-1]+1);
}
else
for(int k=i;k<j;k++)f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
}
}
cout<<f[1][n];
return 0;
}
注意先枚举区间长度。