POJ 1458 && HDU 1159 Common Subsequence (最長公共子序列)dp

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

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

分析:(LCS算法)

给定一个序列Xm = (x1, x2, …, xm),我们定义Xm的第i个前缀为:

Xi = ( x1, x2, …, xi ) i = 0, 1, 2, …, m

c[i, j]为序列Xi = (x1, x2, …, xi)和Yj = (y1, y2, …, yj)的最长公共子序列的长度.

设序列Xm={x1,x2,…,xm}和Yn={y1,y2,…,yn}的一个最长公共子序列为Zk={z1,z2,…,zk},则

1.若xm=yn,

则zk=xm=yn,且Zk-1是Xm-1和Yn-1的最长公共子序列。

2.若xm≠yn,且zk≠xm,

则Zk是Xm-1和Yn的最长公共子序列。

3.若xm≠yn,且zk≠ yn ,

则Zk是Xm和Yn-1的最长公共子序列。

代碼:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define MAXN 1010
#define RST(N)memset(N, 0, sizeof(N))
using namespace std;

char s1[MAXN], s2[MAXN];
int lcs[MAXN][MAXN], L1, L2;

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

int LCS()
{
    L1 = strlen(s1+1), L2 = strlen(s2+1);
    for(int i=0; i<=L1; i++) lcs[i][0]=0;
    for(int i=0; i<=L2; i++) lcs[0][i]=0;
    for(int i=1; i<=L1; i++) {
        for(int j=1; j<=L2; j++) {
            if(s1[i] == s2[j]) lcs[i][j]=lcs[i-1][j-1]+1;
            else lcs[i][j]=max(lcs[i-1][j], lcs[i][j-1]);
        }
    }
    return lcs[L1][L2];
}

int main()
{
    while(~scanf("%s %s", s1+1, s2+1)) {
        printf("%d\n", LCS());
    }
    return 0;
}
时间: 2024-11-10 14:03:41

POJ 1458 && HDU 1159 Common Subsequence (最長公共子序列)dp的相关文章

hdu 1159 Common Subsequence(最长公共子序列 DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 25416    Accepted Submission(s): 11276 Problem Description A subsequence of

hdu 1159 Common Subsequence(最长公共子序列 动态规划)

Common Subsequence Problem 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

hdu 1159 common sequence (最长公共子序列 dp)

http://acm.hdu.edu.cn/showproblem.php?pid=1159 题意 : 给出两个字符串 求出最长公共子序列 思路: if(str1[i]==str2[j]) { dp[i][j]=max(dp[i-1][j-1]+1,max(dp[i-1][j],dp[i][j-1])); } else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); #include<cstdio> #include<cstring> #include&l

hdu 1159 Common Subsequence(最长公共子序列)

#include<bits/stdc++.h> using namespace std; int dp[1024][1024]; int main() { int i,j; char s1[1024],s2[1024]; while(~scanf("%s %s",s1,s2)) { memset(dp,0,sizeof(dp)); int len1=strlen(s1); int len2=strlen(s2); for(i=0;i<len1;i++) { for(j

POJ 1159 Palindrome &amp;&amp; HDU 1159 Common Subsequence

1.先说说杭电的1159吧! 这道题是基础动规,比较简单! 就是要你求最长的公共子序列(不要优化) 动态转移方程: dp[i+1][j+1]=(a[i]=b[i])?dp[i][j]+1:max(dp[i+1][j],dp[i][j+1]) AC代码: #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define N 520 char a[N],b[N]; in

POJ 1458 Common Subsequence(最长公共子序列LCS)

POJ1458 Common Subsequence(最长公共子序列LCS) http://poj.org/problem?id=1458 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列长度. 分析: 本题不用输出子序列,非常easy,直接处理就可以. 首先令dp[i][j]==x表示A串的前i个字符和B串的前j个字符的最长公共子序列长度为x. 初始化: dp全为0. 状态转移: IfA[i]==B[j] then dp[i][j]= dp[i-1][j-1]+1 else dp[

HDU 1159——Common Subsequence(DP)

Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 23279    Accepted Submission(s): 10242 Problem Description A subsequence of a given sequence is the given sequence with some e

hdu 1159 Common Subsequence(最长公共子序列)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 37551    Accepted Submission(s): 17206 Problem Description A subsequence of

HDU 1159 Common Subsequence(裸LCS)

传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 47676    Accepted Submission(s): 21890 Problem Description A subsequence of