- dp[i-1][j]
- dp[i - 1][j - 1]
- dp[i][j - 1]
对于第一个,要求的dp[i][j],要做的是比较x[i]和空(可能是insertion或者deletion,不关注),操作代价为1。对于dp[i][j - 1]同样是如此。但是,对于dp[i - 1][j - 1]而言,就要考察x[i]和y[j]是否相等,如果相等,则dp[i][j] = dp[i - 1][j - 1],否则,dp[i][j] = dp[i - 1][j - 1] + 1。综上,得到递归表达形式如下:
dp[i][j]=min( dp[i - 1][j - 1] , dp[i][j - 1] + 1, dp[i - 1][j] + 1) 当x[i] == y[j]
dp[i][j]=min( dp[i - 1][j - 1] + 1, dp[i][j - 1] + 1, dp[i - 1][j] + 1) 当x[i] != y[j]
代码如下,注意多测试用例,我wa了一次,就是因为这个:
#include
#include
#include
using namespace std;
char x[1001], y[1001];
int xl, yl;
short int dp[1001][1001];
int threeMin(int i, int j, int k) {
return min(min(i, j), k);
}
int main() {
while (cin >> xl >> x >> yl >> y) {
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= xl; ++i)
dp[i][0] = dp[i - 1][0] + 1;
for (int i = 1; i <= yl; ++i)
dp[0][i] = dp[0][i - 1] + 1;
for (int i = 1; i <= xl; ++i)
for (int j = 1; j <= yl; ++j) {
if (x[i - 1] == y[j - 1])
dp[i][j] = threeMin(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1]);
else
dp[i][j] = threeMin(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1);
}
cout << dp[xl][yl] << endl;
}
return 0;
}