最长公共子序列(hdoj1159)
2012-02-24 17:11
288 查看
一 问题描述
最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。
比如,序列{a , b , c , b , d , a , b} 和 {b , d , c , a , b , a}的最长公共子序列为{b, d, a, b},长度为4
二 算法
假定两个序列是s1和s2,定义c[i][j]为 s1 的前i个序列 与 s2 的前j个序列的最长公共子序列长度。那么有:
如果s1[i] == s2[j],c[i][j] = c[i-1][j-1];
否则,c[i][j] = max{c[i-1][j], c[i][j-1]};
三 代码
#include <iostream> #include <cstdio> #include <string> #include <algorithm> using namespace std; int c[1002][1002]; int main() { string s1; string s2; while (cin >> s1 >> s2) { size_t i,j; for (i = 0; i < s1.length(); ++i) { for (j = 0; j < s2.length(); ++j) { if (s1[i] == s2[j]) c[i+1][j+1] = 1 + c[i][j]; else c[i+1][j+1] = max(c[i][j+1], c[i+1][j]); } } cout << c[i][j] << endl; } return 0; }
#include <iostream> #include <vector> #include <stack> #include <string> #include <limits.h> #include <assert.h> using namespace std; int c[100][100]; char f[100][100]; void print(char arr[][100], string s, int i, int j) { if (i == -1 || j == -1) return; if (arr[i][j] == 'E') { print(arr, s, i-1, j-1); cout << s[i]; } else if (arr[i][j] == 'L') { print(arr, s, i, j-1); } else { print(arr, s, i-1, j); } } int main() { int i,j; string s1="abcd"; string s2 = "abbd"; for (i = 0; i < s1.length(); ++i) for (j = 0; j < s2.length(); ++j) { if (s1[i] == s2[j]) { c[i+1][j+1] = c[i][j] + 1; f[i][j] = 'E'; } else { if (c[i+1][j] > c[i][j+1]) { c[i+1][j+1] = c[i+1][j]; f[i][j] = 'L'; } else { c[i+1][j+1] = c[i][j+1]; f[i][j] = 'U'; } } } cout << c[i][j] << endl; print(f, s1, i-1, j-1); return 0; }
相关文章推荐
- HDU/HDOJ 1159/POJ 1458 Common Subsequence(最长公共子序列LCS,滚动数组)
- 最长公共子序列!!!!!HDOJ-1159
- 暑期dp46道(43)--HDOJ 1159 最长公共子序列(可不连续)
- HDOJ 1159(POJ 1458)Common Subsequence (最长公共子序列 LCS)
- hdoj-1159-Common Subsequence【动态规划求最长公共子序列】
- hdoj1159Common Subsequence(LCS 最长公共子序列)
- hdoj 1159最长公共子序列
- hdoj1159 (dp 最长公共子序列)
- HDOJ 1159 Common Subsequence(最长公共子序列)
- hdoj 1159最长公共子序列
- hdu 1159 Common Subsequence(动态规划:最长公共子序列)
- 1159Common Subsequence(最长公共子序列)
- HDOJ 1159 Common Subsequence 解题报告
- 最长公共子序列DP Common Subsequence HDU 1159
- hdu 1159 最长公共子序列
- hdoj 1159 Common Subsequence【LCS】【DP】
- POJ 1458 || HDOJ 1159 Common Subsequence (DP)
- HDU 1159 最长公共子序列问题 动态规划
- hdu 1159 最长公共子序列
- hdu【1159】Common Subsequence 【最长公共子序列】