DP问题
状态表示:所有从a[1~n]变为b[1~m]的方案,属性:Min
状态计算:1.删操作:f[i - 1,j] + 1;
2.增操作:f[i,j - 1] + 1
3.改操作:1.当两个字符串最后一位相等时,f[i - 1,j - 1]
2.当两个字符串最后一位不相等时,f[i - 1,j - 1] + 1;
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1010;
int f[N][N];
char a[N],b[N];
int n,m;
int main(){
scanf("%d%s",&n,a + 1);
scanf("%d%s",&m,b + 1);
for(int i = 0;i <= m;++i) f[0][i] = i;
for(int i = 0;i <= n;++i) f[i][0] = i;
for(int i = 1;i <= n;++i){
for(int j = 1;j <= m;++j){
f[i][j] = min(f[i - 1][j] + 1,f[i][j - 1] + 1);
if(a[i] == b[j]) f[i][j] = min(f[i][j],f[i - 1][j - 1]);
else f[i][j] = min(f[i][j],f[i - 1][j - 1] + 1);
}
}
printf("%d\n",f[n][m]);
return 0;
}