acwing-902. 最短编辑距离
思路:
dp题
f[i][j]: 表示 对a字符串的第i个位置进行操作 使得a字符串前i个字符转换为b字符串前j个字符相同 的集合,
属性: min
状态转移:
删除导致: a字符串前i个字符转换为b字符串前j个字符相同 f[i - 1][j] + 1
增加导致: 同理 f[i][j - 1] + 1
a[i] == b[j] 相同 f[i - 1][j - 1]
a[i] != b[j] 改: f[i - 1][j - 1] + 1
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int f[N][N];
int n, m;
string a, b;
int main(){
cin >> n >> a >> m >> b;
a = " " + a;
b = " " + b;
memset(f, 0x3f, sizeof f);
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][j - 1], f[i - 1][j]) + 1;
//改:
if(a[i] == b[j]) f[i][j] = min(f[i - 1][j - 1], f[i][j]);
else f[i][j] = min(f[i - 1][j - 1] + 1, f[i][j]);
}
cout << f[n][m];
return 0;
}