首页 > 学院 > 开发设计 > 正文

HDU1159 Common Subsequence

2019-11-06 07:31:55
字体:
来源:转载
供稿:网友

Common Subsequence

                                                        Time Limit: 2000/1000 MS (java/Others)    Memory Limit: 65536/32768 K (Java/Others)

 

                                                        Total Submission(s): 37169    Accepted Submission(s): 17020PRoblem DescriptionA 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 abfcabprogramming contest abcd mnp Sample Output
420 SourceSoutheastern Europe 2003就是给你两个字符串,让你求出这两个字符串的最大公共子序列,也就是LCS问题注意最长公共子串(Longest CommonSubstring)和最长公共子序列(LongestCommon Subsequence, LCS)的区别:子串(Substring)是串的一个连续的部分,子序列(Subsequence)则是从不改变序列的顺序,而从序列中去掉任意的元素而获得的新序列;更简略地说,前者(子串)的字符的位置必须连续,后者(子序列LCS)则不必。比如字符串acdfg同akdfc的最长公共子串为df,而他们的最长公共子序列是adf。LCS可以使用动态规划法解决。下文具体描述。这里有一篇比较详细的讲解,可以借鉴一下点击打开链接
#include<stdio.h>#include<string.h>#define max(a,b) (a>b?a:b)//选择较大值char s1[1010];char s2[1010];int dp[1010][1010];int main(){    while(scanf("%s%s",s1,s2)!=EOF)    {        int i,j;        int len1=strlen(s1);        int len2=strlen(s2);        memset(dp,0,sizeof(dp));        for(i=1;i<=len1;++i)        {            for(j=1;j<=len2;++j)            {                if(s1[i-1]==s2[j-1])                {                    dp[i][j]=dp[i-1][j-1]+1;                }                else                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);            }        }        printf("%d/n",dp[len1][len2]);    }    return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表