902 最短编辑距离
作者:
Qiner
,
2024-12-19 17:12:16
,
所有人可见
,
阅读 3
思路:dp[i][j]按照a[i]是否和b[j]相等分为两个集合,若不相等,则按照对原字符串最后一个字符分别进行插入,删除,修改三种操作分为三个更小的集合
易错:做dp题之前一定要想想dp数组要不要单独初始化一下
min函数不能传入三个参数!!!!
#include <iostream>
using namespace std;
const int NN = 1010;
int n, m, dp[NN][NN];
char a[NN], b[NN];
int main(){
cin >> n; cin >> a + 1;
cin >> m; cin >> b + 1;
for (int i = 0; i <= n; i ++) // 特殊初始化,不再是默认为0
for (int j = 0; j <= m; j ++){
if (!i) dp[i][j] = j;
if (!j) dp[i][j] = i;
}
for (int i = 1; i <= n; i ++){
for (int j = 1; j <= m; j ++){
if (a[i] == b[j]) dp[i][j] = dp[i - 1][j - 1];
else{
// dp[i][j] = min(dp[i - 1][j - 1], dp[i][j - 1], dp[i - 1][j]) + 1;
// min只能传入两个参数,害我debug半天😭
dp[i][j] = min(dp[i - 1][j - 1], min(dp[i][j - 1], dp[i - 1][j])) + 1;
}
}
}
cout << dp[n][m];
return 0;
}