先把A串当成一个空串,然后f[i][j]表示区间[i,j]的一个空串刷成B串最少需要多少个步骤。
在转移的过程中,f[i][j]的初值赋f[i][j]=f[i+1][j]+f[i][i],然后从枚举k=i+1开始到r,如果B[i]==B[k],那么f[i][r]=min(f[i][r],f[i+1][k]+f[k+1][r]),因为这样刷会使步骤尽可能的减少。
最后再根据s1,求出最少步骤即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100+5;
int f[maxn][maxn];
int ans[maxn];
char s1[maxn],s2[maxn];
int main()
{
while(scanf("%s%s",s1,s2)!=EOF)
{
int len=(int)strlen(s1);
for(int i=0;i<len;i++) f[i][i]=1;
for(int j=1;j<len;j++)
{
for(int i=0;i+j<len;i++)
{
int r=i+j;
f[i][r]=f[i+1][r]+f[i][i];
for(int k=i+1;k<=r;k++)
{
if(s2[i]==s2[k])
f[i][r]=min(f[i][r],f[i+1][k]+f[k+1][r]);
}
}
}
if(s1[0]==s2[0]) ans[0]=0;
else ans[0]=1;
for(int i=1;i<len;i++)
{
if(s1[i]==s2[i]) ans[i]=ans[i-1];
else{
ans[i]=f[0][i];
for(int j=0;j<i;j++)
ans[i]=min(ans[i],ans[j]+f[j+1][i]);
}
}
cout<<ans[len-1]<<endl;
}
return 0;
}