poj1458 Common Subsequence (dp,最长公共子序列)

原创 2016年06月01日 19:06:46

题目链接:

http://poj.org/problem?id=1458


Common Subsequence
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 46650   Accepted: 19171

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

Source


题意:

给你2个字符串序列,求两个字符串的最大公共子序列,当然要保证字符之间的相对顺序不发生改变解题思路:

解题思路:

假设第一个字符串长度为len1,第二个字符串长度为len2。

若我们用数组dp[i][j]表示 当第一个字符串长度为 i ,第二个字符串长度为 j的时候的最长公共子序列长度,则所求答案为dp[len1][len2]
那么要怎么从其他状态转移过来呢,他的前一个状态可能是 dp[i-1][j-1],可能是dp[i-1][j] ,也可能是dp[i][j-1]。

若第一个字符串第 i 个字符与 第二个字符串第 j 个字符的是相同的,那么dp[i][j] 就是 dp[i-1][j-1] +1了。

若不同,只要在 dp[i][j-1],dp[i-1][j-1],dp[i-1][j] 3个状态即可。


AC代码如下:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<set>
#include<cmath>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
const int maxn  = 1010;
char str1[maxn];
char str2[maxn];
int dp[maxn][maxn];
int main()
{
    while(~scanf("%s%s",str1,str2))
    {
        int len1 = strlen(str1);
        int len2 = strlen(str2);
        memset(dp,0,sizeof(dp));
        for(int i = 0 ; i < len1; i++)
            for(int j = 0; j < len2; j++)
            {
                dp[i+1][j+1] = dp[i][j];
                if(str1[i]==str2[j])
                    dp[i+1][j+1] = dp[i][j] + 1;
                else
                    dp[i+1][j+1] = max(dp[i+1][j],dp[i][j+1]);
            }
        cout << dp[len1][len2]<<endl;
    }

    return 0 ;
}








版权声明:本文为博主原创文章,未经博主允许不得转载。

最长公共子序列(LCS问题)的DP解法

呃。。大一做过,毕竟是ACM入门DP题,但是大三的我已然忘了具体咋做了,只记得是DP,面试常会问这个问题,所以有必要搞明白。 题目描述略。 解题思想就是DP,DP无外乎需要知道两个东西,一是状态是什么...
  • u013303743
  • u013303743
  • 2016年04月23日 10:40
  • 704

LCS 最长公共子序列(DP经典问题)

最长公共子序列问题以及背包问题都是DP(动态规划)算法的经典题目,值得深度挖掘以致了解DP算法思想。问题如下: 最长公共子序列 时间限制:3000 ms  |  内存限制:6553...
  • u014492609
  • u014492609
  • 2014年08月08日 15:48
  • 1254

最长公共子序列与最长公共子串(DP)

1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogsbelong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序...
  • u012102306
  • u012102306
  • 2016年11月16日 11:14
  • 3830

POJ1458 Common Subsequence (最长公共子序列)

Description A subsequence of a given sequence is the given sequence with some elements (possible no...
  • sunny1996
  • sunny1996
  • 2015年03月28日 22:33
  • 196

Common Subsequence(最长公共子序列+动态规划)hdu1159 经典

Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe...
  • u010579068
  • u010579068
  • 2015年10月17日 21:06
  • 1464

【openjudge 1759】最长上升子序列(dp)

松叶正秋琴韵响,菱花初晓镜光寒
  • reverie_mjp
  • reverie_mjp
  • 2016年11月01日 21:54
  • 257

动态规划 最长公共子序列 过程图解

1.基本概念       首先需要科普一下,最长公共子序列(longest common sequence)和最长公共子串(longest common substring)不是一回事儿。什么是子序...
  • hrn1216
  • hrn1216
  • 2016年05月29日 22:54
  • 41365

最长公共子序列(LCS)

1、LCS基本概念          子序列:一个序列X任意删除若干个字符得到新序列Z,则Z叫做X的子序列。例如Z=是X=B,C,B,D,A,B>的子序列,相当于删除A、B、A。          公...
  • DQ_DM
  • DQ_DM
  • 2015年04月14日 16:18
  • 7599

【动态规划】输出所有的最长公共子序列

上篇讲到使用动态规划可以在 θ(mn) 的时间里求出 LCS 的长度,本文将讨论如何输出最长公共子序列。 问题描述:给定两个序列,例如 X = “ABCBDAB”、Y = “BDCABA”,求它们的最...
  • lisong694767315
  • lisong694767315
  • 2014年11月29日 15:41
  • 6892

C++实现最长公共子序列和最长公共子串

转载自:点击打开链接 #include "stdafx.h" #include #include using namespace::std; int lcs(string str1, st...
  • chengonghao
  • chengonghao
  • 2016年07月14日 21:36
  • 5748
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj1458 Common Subsequence (dp,最长公共子序列)
举报原因:
原因补充:

(最多只允许输入30个字)