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的字符串,表示两个序列。两个字符串之间由若干个空格隔开。
输出对每组输入数据,输出一行,给出两个序列的最大公共子序列的长度。
样例输入
样例输出
描述我们称序列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 20
/* 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; }
相关文章推荐
- NOI 1808:公共子序列(C++) 动态规划
- 1808:公共子序列(2.6基本算法之动态规划)
- [OpenJudge-NOI]神奇序列求和
- 1808:公共子序列
- 2.6基本算法之动态规划 /1808:公共子序列
- 1808:公共子序列(公共子序列)
- 1808:公共子序列 题解
- 【openjudge】公共子序列
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和
- 最长公共子串(子序列)、最长递增子序列、最长回文子串等问题
- 2012年湖南省第八届程序设计大赛 J 病毒(最长上升公共子序列)
- Openjudge-NOI题库-和数
- Openjudge-NOI题库-二维数组回形遍历
- noi 2009 变换序列
- LCS 最大公共序列算法粗略讲解
- 一个粗糙的打印两序列所有最大公共子序列的方法
- POJ 4044 寻找最长连续公共子序列
- HDU1423(最长上升公共子序列)
- 【二分图匹配】【NOI2009】变换序列