最新消息:点击查看大S的省钱秘笈

POJ 1458 Common Subsequence C++版

POJ题解 Slyar 131浏览 0评论

文章作者:姜南(Slyar) 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

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])

转载请注明:Slyar Home » POJ 1458 Common Subsequence C++版

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (4)

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