[poj3356]字符串dp..2014.8.11

来源:互联网 发布:energy star软件 编辑:程序博客网 时间:2024/04/30 05:42
/* * 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;}

0 0