代码
#include<iostream>
using namespace std;
const int N=1100;
char a[N];
char b[N];
int f[N][N];
int main(){
int m,n;
cin>>m>>(a+1);
cin>>n>>(b+1);
for(int i=1;i<=n;i++)
f[0][i]=i;
for(int j=1;j<=m;j++)
f[j][0]=j;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
f[i][j]=min(f[i-1][j],f[i][j-1])+1;
f[i][j]=min(f[i][j],f[i-1][j-1]+(a[i]!=b[j]));
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cout<<f[i][j]<<' ';
}
cout<<endl;
}
//cout<<f[m][n]<<endl;
return 0;
}
为什么不能以划分的那种i,j依据来进行计算?
例子:
uuaz
ulua
这个显然最少操作数为2,但是如果以i,j长短和a[i],b[j]为依据进行划分那么当a[i]!=b[j]时,一定执行替换操作,但是
从全局来看可能删除/增添比替换更好