您的位置:首页 > 运维架构

OpenJudge-Noi 1808 公共子序列

2017-02-25 11:38 330 查看
总时间限制: 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

/* 1.最优子问题 2.无后效性
动态规划的思路就是在满足上述2个条件下  找到另一种描述的形式 推出动态转移方程(当然很多题目没那么容易想出来- -)
* dp[i][j]表示s1的前i个字符和s2的前j个字符的最大公共子列
*  动态转移方程:
if (p[i] == q[j])
dp[i+1][j+1] = dp[i][j] + 1;
else
dp[i+1][j+1] = max(dp[i][j+1], dp[i+1][j]);
*/
#include "iostream"
#include "cstring"
#include "algorithm"
using namespace std;
int main()
{
char p[201], q[201];
int dp[201][201];
while (cin >> p >> q) {
memset(dp, 0, sizeof(dp));
int lenP = strlen(p);
int lenQ = strlen(q);
for (int i = 0; i<lenP; i++)
for (int j = 0; j < lenQ; j++) {
if (p[i] == q[j])
dp[i+1][j+1] = dp[i][j] + 1;
else
dp[i+1][j+1] = max(dp[i][j+1], dp[i+1][j]);
}
cout << dp[lenP][lenQ] << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: