POJ公共子序列
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
- 我们称序列Z = < z1, z2, ..., zk >是序列X = < x1, x2, ..., xm >的子序列当且仅当存在 严格上升 的序列< i1, i2, ..., ik >,使得对j = 1, 2, ... ,k, 有xij = zj。比如Z = < a, b, f, c > 是X = < a, b, c, f, b, c >的子序列。
现在给出两个序列X和Y,你的任务是找到X和Y的最大公共子序列,也就是说要找到一个最长的序列Z,使得Z既是X的子序列也是Y的子序列。 - 输入
- 输入包括多组测试数据。每组数据包括一行,给出两个长度不超过200的字符串,表示两个序列。两个字符串之间由若干个空格隔开。
- 输出
- 对每组输入数据,输出一行,给出两个序列的最大公共子序列的长度。
- 样例输入
-
abcfbc abfcab programming contest abcd mnp
- 样例输出
-
4 2 0
- 来源
- 翻译自Southeastern Europe 2003的试题
-
#include <iostream> #include <math.h> #include <string.h> #include <algorithm> #include <vector> #include <queue> #define INF 0x3f3f3f3f using namespace std; int main() { char left[205], right[205]; int dp[205][205]; memset(dp, 0, sizeof dp); while (cin >> left >> right){ int llen = strlen(left); int rlen = strlen(right); for (int i = 1; i <= llen;i++) for (int j = 1; j <= rlen; j++) { if (left[i - 1] == right[j - 1]) dp[i][j] = dp[i - 1][j - 1]+1; else{ dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]); } } printf("%d\n", dp[llen][rlen]); } return 0; }
posted on 2018-12-02 14:42 zhouyuepku 阅读(202) 评论(0) 编辑 收藏 举报