题意:
求一个字符串变成另一个字符串的最少编辑次数。
思路:
用f[i][j]记录ai到bj的最短编辑距离,可以得出动态转移方程:
当a[i]=b[j]时,f[i][j]=f[i-1][j-1];否则f[i][j]=min(f[i-1][j-1]+1,f[i][j-1]+1,f[i-1][j]+1,
其中f[i-1][j-1]+1代表把a[i]改为b[j],f[i][j-1]+1代表a[i]后面插入b[j-1],f[i-1][j]+1代表删掉a[i]。
其中f[i-1][j-1]+1代表把a[i]改为b[j],f[i][j-1]+1代表a[i]后面插入b[j-1],f[i-1][j]+1代表删掉a[i]。
代码:
#include<cstdio>
#include<cstring>
int f[2002][2002],m,n;
char a[2002],b[2002];
int min(int x,int y) {return x>y?y:x;}
int main()
{
scanf("%s%s",a,b);
m=strlen(a);n=strlen(b);
for (int i=1;i<=m;i++)
f[i][0]=i;
for (int i=1;i<=n;i++)
f[0][i]=i;//赋初值
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
if (a[i-1]==b[j-1]) f[i][j]=f[i-1][j-1];//相同就不用改
else f[i][j]=min(min(f[i-1][j],f[i][j-1]),f[i-1][j-1])+1;//这样写是为了简化
printf("%d\n",f[m][n]);
}