POJ3356

来源:互联网 发布:网络7层协议 编辑:程序博客网 时间:2024/05/17 00:10

这道题一开始做不出来,去查解题报告都说很简单。但是自己分析的时候却没弄清楚。

首先这道题应该不是用短的那串去减掉最长公共子序列(没有严格证明过,只是画了一下感觉不是。)

状态转移一开始也没理清,睡了一觉,醒来有如神助一下就写出来了。

if(s1[i - 1] == s2[j - 1])f[i][j] = min(f[i - 1][j - 1], f[i][j - 1] + 1, f[i - 1][j] + 1);elsef[i][j] = min(f[i - 1][j - 1], f[i][j - 1], f[i - 1][j]) + 1;

这个方程自己仔细推敲下吧,不解释了。其实不难,只是自己想可能不太容易理清思路。

下面是这道题的代码:

#include<iostream>#include<string>using namespace std;int l1, l2;string s1, s2;int f[1100][1100];int min(int a, int b, int c){int k = a < b? a : b;return k < c? k : c;}int main(){while(cin >> l1 >> s1 >> l2 >> s2){for(int i = 1; i <= l1; ++i)f[i][0] = i;for(int j = 1; j <= l2; ++j)f[0][j] = j;f[0][0] = 0;for(int i = 1; i <= l1; ++i){for(int j = 1; j <= l2; ++j){if(s1[i - 1] == s2[j - 1])f[i][j] = min(f[i - 1][j - 1], f[i][j - 1] + 1, f[i - 1][j] + 1);elsef[i][j] = min(f[i - 1][j - 1], f[i][j - 1], f[i - 1][j]) + 1;}}cout << f[l1][l2] << endl;}return 0;}