hdu1159-Common Subsequence(DP:最长公共子序列LCS)

Common Subsequence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 49216    Accepted Submission(s): 22664

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 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.

Sample Input

abcfbc abfcab

programming

contest abcd mnp

Sample Output

4

2

0

Source

Southeastern Europe 2003

代码:

#include<iostream>
#include<string.h>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int  maxnum = 1000 + 5;
int dp[maxnum][maxnum];
#define max(x,y){x>y?x:y}
void DP_LCS(char str1[], char str2[])
{
    memset(dp, 0, sizeof(dp));
    int i, j;
    for (i = 0; i < strlen(str1); i++)
    {
        for (j = 0; j < strlen(str2); j++)
        {
            if ( strlen(str1)==0 || strlen(str2) == 0)//边界情况:如果有个字符串长度为0
            {
                dp[i+1][j+1] = 0;//公共子序列为0
            }
            if (str1[i] == str2[j])//第一种情况:a[i]==b[j]  A的前i个,B的前j个;
            {
                dp[i+1][j+1] = dp[i][j] + 1;//直接加1
            }
            else//第二、三种情况 dp[i][j]=dp[i-1][j]||dp[i][j]=dp[i][j-1]  A的前i-1个,B的前j个;A的前i个,B的前j-1个;
            {
                dp[i+1][j+1] = max(dp[i][j+1], dp[i+1][j]);
            }
        }
    }
    cout<< dp[strlen(str1)][strlen(str2)]<<endl;
}
int main()
{
    char  str1[maxnum], str2[maxnum];
    int N;
    while (cin >> str1 >> str2)
    {
        DP_LCS(str1, str2);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/gcter/p/9859324.html

时间: 2024-11-07 21:17:29

hdu1159-Common Subsequence(DP:最长公共子序列LCS)的相关文章

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

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

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

题意: 两个字符串,判断最长公共子序列的长度. 思路: 直接看代码,,注意边界处理 代码: char s1[505], s2[505]; int dp[505][505]; int main(){ while(scanf("%s%s",s1,s2)!=EOF){ int l1=strlen(s1); int l2=strlen(s2); mem(dp,0); dp[0][0]=((s1[0]==s2[0])?1:0); rep(i,1,l1-1) if(s1[i]==s2[0]) dp

uva 10405 Longest Common Subsequence (最长公共子序列)

uva 10405 Longest Common Subsequence Sequence 1: Sequence 2: Given two sequences of characters, print the length of the longest common subsequence of both sequences. For example, the longest common subsequence of the following two sequences: abcdgh a

POJ 1458 Common Subsequence 【最长公共子序列】

解题思路:先注意到序列和串的区别,序列不需要连续,而串是需要连续的,先由样例abcfbc         abfcab画一个表格分析,用dp[i][j]储存当比较到s1[i],s2[j]时最长公共子序列的长度 a    b    f    c    a    b 0    0    0    0    0   0    0 a  0    1     1    1    1   1    1 b  0    1     2    2    2   2    2 c  0    1     2  

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

Common Subsequence(最长公共子序列)

题意简述:求两个字符串的最长公共子序列的长度 思路:最经典的最长公共子序列的长度(LCS问题).动态转移方程如下:字符串X和字符串Y,dp[i][j]表示的是X的前i个字符和Y的前j个字符的最长公共子序列长度.如果 X[i]==Y[j],那么新的LCS+1;如果X[i]!=Y[j],则分别考察dp[i-1][j],和dp[i][j-1],区较大者即可. #include <iostream> #include <string> #include <cmath> usin

POJ 1458 - Common Subsequence(最长公共子序列) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=1458 题目大意: 有若干组数据,每组给出两个字符串(中间用任意数量的空格间隔),输出这两个字符串最长公共子序列的长度.每次输出后换行. 分析: 动态规划求LCS,f[i][j]表示第一个字符串匹配到第i位,第二个字符串匹配到第j位时最长公共子序列的长度. 转移方程:当a[i] = b[i]时,f[i][j] = f[i-1][j-1]+1,其他情况时f[i][j

uva 10405 Longest Common Subsequence(最长公共子序列)

经典的最长公共子序列问题,我刚开始用string敲的,就是为了练练手,没想到竟然wa了,还以为我用错了呢...换了字符数还是wa...真无语,这么简单的题快把我弄糊涂了,后来听人说是输入可能有空格...这是巨坑啊,题上都没说清楚,白白wa了几发...就是设一个数组d[i][j]遍历两个字符数组当a[i]==b[j]的时候d[i][j]=d[i-1][j-1]+1.不相等的时候就是d[i][j]=max(d[i-1][j],d[i][j-1]).别忘了初始化.真坑 代码: #include<ios

杭电1159 Common Subsequence【最长公共子序列】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 解题思路:任意先给出两个字符串 abcfbc abfcab,用dp[i][j]来记录当前最长的子序列,则如果有x[i]与y[j]相等的话,则相当于公共子序列的长度在dp[i-1][j-1]上增加1, 如果x[i]与y[j]不相等的话,那么dp[i][j]就取得dp[i][j-1]和dp[i-1][j]中的最大值即可.时间复杂度为O(mn) 反思:大概思路想出来之后,因为dp数组赋初值调了很久,