# POJ 1458 Common Subsequence C++版

POJ题解 3997浏览

DP 最长公共子序列

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.

Input

The program input is from the std input. Each data set in the input contains two strings representing the given sequences. The sequences are separated by any number of white spaces. The input data are correct.

Output

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.

Sample Input

abcfbc         abfcab
programming    contest
abcd           mnp

Sample Output

4
2
0

Slyar:DP基础，最长公共子序列(LCS)问题。动态转移方程如下，设有字符串X和字符串Y，dp[i,j]表示的是X的前i个字符与Y的前j个字符的最长公共子序列长度。如果X[i]==Y[j]，那么这个字符与之前的LCS一定可以构成一个新的LCS；如果X[i]!=Y[j]，则分别考察dp[i-1,j]和dp[i,j-1]，选择其中的较大者为LCS。

if (i == 0 || j == 0) dp[i,j] = 0

else if (X[i] == Y[j]) dp[i,j] = dp[i-1,j-1] + 1

else dp[i,j] = max(dp[i-1,j], dp[i,j-1])

```#include
#include

using namespace std;

const int SIZE = 999;
int dp[SIZE][SIZE] = {0};

int max(int x, int y)
{
return x > y ? x : y;
}

int main()
{
int len1, len2;
string str1, str2;
while (cin >> str1 >> str2)
{
len1 = str1.length();
len2 = str2.length();
for (int i = 1; i <= len1; i++)
{
for (int j = 1; j <= len2; j++)
{
if (str1[i-1] == str2[j-1])
{
dp[i][j] = dp[i-1][j-1] + 1;
}
else
{
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
}
cout << dp[len1][len2] << endl;
}
return 0;
}
```

### 网友最新评论 (4)

1. 原来如此，我试试。
shilong10年前 (2011-09-06)回复
2. @shilong 再开一个数组保存每步的值就行了，倒着打印一下就成
Slyar10年前 (2011-09-05)回复
3. 试问，这里只输出最长公共子序列的长度，那么如何输出这个最长公共子序列？
shilong10年前 (2011-09-05)回复
4. DP基础那段用红色字体标出的很重要吗
NFLMerchandise11年前 (2010-09-17)回复