/*
* dp[i][j]:str1的前i个构成的串变成str2前j个构成的串需要的最少步数
* dp[i][j] = min{
* dp[i-1][j-1]+(str1[i]==str2[j]?0:1) -> 改变
* dp[i-1][j] + 1 -> 删除str1第i个字符
* dp[i][j-1] + 1 -> 添加str2第j个字符到str1的第i个位置
* }
* 因为dp[i][j]全部从dp[i-1]转移而来,所以用滚动数组把4M内存优化到了300+K,非常的犀利.嘿嘿
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX = 1024;
const int INF = 0xfffffff;
char a[MAX], b[MAX];
int dp1[MAX], dp2[MAX];
int main() {
int la, lb;
while (~scanf(" %d %s %d %s", &la, a+1, &lb, b+1)) {
for (int i = 0; i <= lb; ++i) dp2[i] = i;
for (int i = 1; i <= la; ++i) {
dp2[0] = i-1;
dp1[0] = i;
for (int j = 1; j <= lb; ++j) {
dp1[j] = dp2[j-1] + (a[i] == b[j] ? 0 : 1);
dp1[j] = min(dp1[j], min(dp2[j]+1, dp1[j-1]+1));
}
memcpy(dp2, dp1, sizeof(int)*(lb+1));
}
printf("%d\n", dp1[lb]);
}
return 0;
}
[poj3356]字符串dp
最新推荐文章于 2022-02-04 16:29:34 发布