51NOD 1006 最长公共子序列 动态规划
2016-09-25 21:30
281 查看
题目描述:
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。比如两个串为:
abcicba
abdkscab
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input
第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)
Output
输出最长的子序列,如果有多个,随意输出1个。
Input示例
abcicba abdkscab
Output示例
abca
题目分析:
LCS最长公共子序列。动态规划的入门题目。
代码如下:
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int dp[1001][1001]; char X[1001]; char Y[1001]; int i, j; int main() { cin.getline(X,1001); cin.getline(Y,1001); int xlen = strlen(X); int ylen = strlen(Y); for(i = 1; i <= xlen; ++i) { for(j = 1; j <= ylen; ++j) { if(X[i-1] == Y[j-1]) { dp[i][j] = dp[i-1][j-1] + 1; } else if(dp[i][j-1] > dp[i-1][j]) { dp[i][j] = dp[i][j-1]; } else { dp[i][j] = dp[i-1][j]; } } } i = xlen; j = ylen; int k = dp[i][j]; char lcs[1001] = {'\0'}; while(i && j) { if(X[i-1] == Y[j-1] && dp[i][j] == dp[i-1][j-1] + 1) { lcs[--k] = X[i-1]; i--; j--; } else if(X[i-1] != Y[j-1] && dp[i-1][j] > dp[i][j-1]) i--; else j--; } printf("%s\n",lcs); }
相关文章推荐
- 51nod 1006 最长公共子序列Lcs(经典动态规划)
- 【51NOD】1006 最长公共子序列Lcs(动态规划)
- 51Nod- 1006 最长公共子序列Lcs(动态规划)
- 51nod 1006:最长公共子序列Lcs
- 51nod_1006 最长公共子序列,输出路径【DP】
- 51Nod 1006 最长公共子序列Lcs
- 51Nod 1006 最长公共子序列Lcs问题 模板题
- 51Nod-1006-最长公共子序列Lcs
- 51nod 1006 最长公共子序列Lcs
- 51nod 最长公共子序列问题(动态规划)(LCS)(递归)
- 51Nod 1006 最长公共子序列Lcs(DP)
- 【51nod】---1006 最长公共子序列Lcs(动态规划&&字符串LCS)
- 51Nod 1006 最长公共子序列Lcs (输出)
- 51nod 1006 最长公共子序列Lcs
- 最长公共子序列Lcs 51Nod - 1006 (线性dp)
- 51nod 1006 最长公共子序列Lcs
- 51Nod-1006-最长公共子序列Lcs
- 51nod 1006 1006 最长公共子序列Lcs
- 51Nod 1006 - 最长公共子序列(Lcs)