5.11 Common Subsequence
2013-05-11 20:41
169 查看
Description
A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = <x1, x2, ..., xm> another sequence Z = <z1, z2, ..., zk> is a subsequence of X if there exists a strictly increasing sequence <i1, i2, ..., ik> of indices of X such that for all j = 1,2,...,k, xij = zj. For example, Z = <a, b, f, c> is a subsequence of X = <a, b, c, f, b, c> with index sequence <1, 2, 4, 6>. Given two sequences X and Y the problem is to find the length of the maximum-length common subsequence of X and Y.
The program input is from a text file. Each data set in the file contains two strings representing the given sequences. The sequences are separated by any number of white spaces. The input data are correct. For each set of data the program prints on the standard output the length of the maximum-length common subsequence from the beginning of a separate line.
Input
abcfbc abfcab programming contest abcd mnp
Output
4 2 0
Sample Input
abcfbc abfcab programming contest abcd mnp
Sample Output
4 2 0
题意:
求最长公共子序列。
思路:
动态规划。
代码如下:
#include <iostream>
#include <string>
using namespace std;
int map[1005][1005];
int main()
{
string str1, str2;
while (cin >> str1 >> str2)
{
memset(map, 0, sizeof(map));
int len1 = str1.length();
int len2 = str2.length();
for (int i = 1; i <= len1; i++)
{
for (int j = 1; j <= len2; j++)
{
map[i][j] = (str1[i - 1] == str2[j - 1]) ? map[i - 1][j - 1] + 1
: max(map[i - 1][j], map[i][j - 1]);
}
}
cout << map[len1][len2] << endl;
}
return 0;
}
A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = <x1, x2, ..., xm> another sequence Z = <z1, z2, ..., zk> is a subsequence of X if there exists a strictly increasing sequence <i1, i2, ..., ik> of indices of X such that for all j = 1,2,...,k, xij = zj. For example, Z = <a, b, f, c> is a subsequence of X = <a, b, c, f, b, c> with index sequence <1, 2, 4, 6>. Given two sequences X and Y the problem is to find the length of the maximum-length common subsequence of X and Y.
The program input is from a text file. Each data set in the file contains two strings representing the given sequences. The sequences are separated by any number of white spaces. The input data are correct. For each set of data the program prints on the standard output the length of the maximum-length common subsequence from the beginning of a separate line.
Input
abcfbc abfcab programming contest abcd mnp
Output
4 2 0
Sample Input
abcfbc abfcab programming contest abcd mnp
Sample Output
4 2 0
题意:
求最长公共子序列。
思路:
动态规划。
代码如下:
#include <iostream>
#include <string>
using namespace std;
int map[1005][1005];
int main()
{
string str1, str2;
while (cin >> str1 >> str2)
{
memset(map, 0, sizeof(map));
int len1 = str1.length();
int len2 = str2.length();
for (int i = 1; i <= len1; i++)
{
for (int j = 1; j <= len2; j++)
{
map[i][j] = (str1[i - 1] == str2[j - 1]) ? map[i - 1][j - 1] + 1
: max(map[i - 1][j], map[i][j - 1]);
}
}
cout << map[len1][len2] << endl;
}
return 0;
}
相关文章推荐
- UVA 10405 Longest Common Subsequence --经典DP
- HDU1423&ZOJ2432 - Greatest Common Increasing Subsequence(LCIS最长公共上升子序列模板)
- HDU 2253 Longest Common Subsequence Again
- POJ 2127 Greatest Common Increasing Subsequence
- poj 1458 Common Subsequence dp 最长公共子序列
- 【算法导论学习-29】动态规划经典问题02:最长公共子序列问题(Longest common subsequence,LCS)
- HDU1159 && POJ1458:Common Subsequence(LCS)
- POJ 1458-Common Subsequence(线性dp/LCS)
- hdoj problem 1423 Greatest Common Increasing Subsequence (动态规划)
- Dynamic Programming longest common subsequence(LCS) 动态规划之最长公共子序列
- hdu1159 Common Subsequence
- hdu 1159 Common Subsequence(最长公共子序列,DP)
- POJ1458--Common Subsequence(dp)
- ZOJ - 1733 Common Subsequence
- HDU 1423--Greatest Common Increasing Subsequence【LCIS】
- longest-common-subsequence
- HDU-1159 Common subsequence
- POJ 1458 && HDU 1159 Common Subsequence(LCS)
- (HDU - 1159) Common Subsequence(DP)
- hdu【1159】Common Subsequence 【最长公共子序列】