HDU1159 Common Subsequence

来源:互联网 发布:权重轮询调度算法 编辑:程序博客网 时间:2024/06/01 08:55

Common Subsequence

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

 

                                                        Total Submission(s): 37169    Accepted Submission(s): 17020


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 abfcabprogramming contest abcd mnp
 

Sample Output
420
 

Source
Southeastern 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;}



0 0
原创粉丝点击