先是考虑将所有与目标字符串不相同的刷成目标串:
dp[i][j]表示刷i-j区间,
初始条件:dp[i][j]=dp[i+1][j]+1;
对于k=(i+1...j )如果str[k]==str[i],则dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]),,因为刷i的时候可以与k同时刷。
上面是对初始串与目标串完全不同的情况,
如果有部分的不同:
ans[i]表示将str1[0...i]刷成str2[0...i]的最小步数,
if str1[i]==str2[i] 则ans[i]=ans[i-1];
else
ans[i]=min(ans[i],ans[j]+dp[j+1][i]) j<i;
#include "stdio.h"
#include "string.h"
int min(int a,int b)
{
if (a<b) return a; else return b;
}
int main()
{
int i,j,k,s,e,n;
char s1[110],s2[110];
int ans[110],dp[110][110];
while(gets(s1))
{
gets(s2);
n=strlen(s1);
memset(dp,0,sizeof(dp));
for (i=0;i<n;i++)
for (j=i;j<n;j++)
dp[i][j]=j-i+1;
for (i=2;i<=n;i++)
for (j=0;j<n-i+1;j++)
{
s=j; e=j+i-1;
dp[s][e]=dp[s+1][e]+1;
for (k=s+1;k<=e;k++)
if (s2[s]==s2[k])
dp[s][e]=min(dp[s][e],dp[s+1][k]+dp[k+1][e]);
}
if (s1[0]==s2[0]) ans[0]=0; else ans[0]=1;
for (i=1;i<n;i++)
{
ans[i]=dp[0][i];
if (s1[i]==s2[i]) ans[i]=ans[i-1];
else
for (j=0;j<i;j++)
ans[i]=min(ans[i],ans[j]+dp[j+1][i]);
}
printf("%d\n",ans[n-1]);
}
return 0;
}