AcWing 902. 最短编辑距离
原题链接
简单
作者:
rushhhhh
,
2021-02-19 15:46:38
,
所有人可见
,
阅读 241
#include <iostream>
using namespace std;
/*
状态表示f[i,j]
集合:对字符串a操作,从a的前i子串到b的前j子串的编辑方案
属性:求最少操作次数,min
状态计算
nothing
if(a[i] == b[j])
f[i-1,j-1]
delete a[i]
f[i-1,j]+1
说明a的 前i-1个 已经和b的 前j个 相同
insert b[j] after a[i]
f[i,j-1]+1
说明a的 前i个 已经和b的 前j-1个 相同
replace a[i] with b[j]
不同,替换也是一种方案,一个分支
f[i-1,j-1]+1
*/
const int N = 1010;
int n, m;
char a[N], b[N];
int f[N][N];
int main()
{
cin >> n >> a+1;
cin >> m >> b+1;
// 全删除
for(int i=0; i<=n; i++)
f[i][0] = i;
// 全插入
for(int i=0; i<=m; i++)
f[0][i] = i;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
f[i][j] = min(f[i-1][j], 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);
}
cout << f[n][m];
return 0;
}