一道朴素dp题
递推方程 还是比较好推的 路径不好找
路径的方法:
从二维数组最后一个位置往回推,可以通过到达该点的的步数判断从哪个点推过来,
判断完这个步骤以后,dp[i][j]就是a的前i个字母和b的前j个字母匹配成功了,然后4种情况输出路径就好了
#include <bits/stdc++.h>
using namespace std;
const int maxn = 85;
int dp[maxn][maxn];
string a, b;
void path() {
int lenA = a.length();
int lenB = b.length();
int i = lenA;
int j = lenB;
int step = dp[lenA][lenB];
int index = 1;
while(i > 0 || j > 0) {
if(i == 0 && j > 0) {
cout << index << " Insert " << 1 << "," << b[j - 1] << endl;
index++;
j--;
}else if(i > 0 && j == 0) {
cout << index << " Delete " << i << endl;
index++;
i--;
}else {
if(step == dp[i - 1][j - 1] && a[i - 1] == b[j - 1]) {
i--;
j--;
}else if(step == dp[i - 1][j - 1] + 1) {
cout << index << " Replace " << i << "," << b[j - 1] << endl;
i--;
j--;
index++;
step--;
}else if(step == dp[i - 1][j] + 1) {
cout << index << " Delete " << i << endl;
i--;
index++;
step--;
}else if(step == dp[i][j - 1] + 1) {
cout << index << " Insert " << i + 1 << "," << b[j - 1] << endl;
step--;
j--;
index++;
}
}
}
}
int main() {
while(cin >> a >> b) {
for(int i = 0; i <= a.length(); i++) {
dp[i][0] = i;
}
for(int i = 0; i <= b.length(); i++) {
dp[0][i] = i;
}
for(int i = 1; i <= a.length(); i++) {
for(int j = 1; j <= b.length(); j++) {
dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + 1;
if(a[i - 1] == b[j - 1]) {
dp[i][j] = min(dp[i][j], dp[i - 1][j - 1]);
}else {
dp[i][j] = min(dp[i][j], dp[i - 1][j - 1] + 1);
}
}
}
cout << dp[a.length()][b.length()] << endl;
path();
}
return 0;
}*/