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:abcdghaedfhris adh of length 3.
Input consists of pairs of lines. The first line of a pair contains the first string and the second line contains the second string. Each string is on a separate line and consists of at most 1,000 characters
For each subsequent pair of input lines, output a line containing one integer number which satisfies the criteria stated above.
Sample input
a1b2c3d4ezz1yy2xx3ww4vvabcdghaedfhrabcdefghijklmnopqrstuvwxyza0b0c0d0e0f0g0h0i0j0k0l0m0n0o0p0q0r0s0t0u0v0w0x0y0z0abcdefghijklmnzyxwvutsrqpoopqrstuvwxyzabcdefghijklmn
Output for the sample input
432614 题目大意:求最长公共子序列 设d[i][j]为A1,A2...Ai和B1,B2...Bj的LCS长度,则的d[i][j]=max{d[i-1][j],d[i][j-1]},如果A[i]=B[j],d[i][j]=max{d[i][j],d[i-1][j-1]+1},边界条件是最外层为0 时间复杂度为O(nm),n、m分别为序列A、B的长度
View Code
1 # include2 # include 3 # define maxn 1005 //这样定义max函数,是不是就不用考虑a,b的类型了 4 # define max(a,b) a>b?a:b 5 int dp[maxn][maxn]; 6 char a[maxn],b[maxn]; 7 int main(){ 8 int lena,lenb,i,j; 9 while(gets(a)&&gets(b)){ //题目中这里不能用scanf,只能用gets输入10 lena=strlen(a);11 lenb=strlen(b);12 13 for(i=0;i<=lena;i++)14 for(j=0;j<=lenb;j++)15 dp[i][j] = 0;16 17 for(i=1;i<=lena;i++)18 {19 for(j=1;j<=lenb;j++)20 {21 dp[i][j] = max(dp[i-1][j],dp[i][j-1]); 22 if(a[i-1]==b[j-1]) 23 dp[i][j] = max(dp[i][j] , dp[i-1][j-1] + 1);24 } 25 } 26 27 printf("%d\n",dp[lena][lenb]);28 }29 return 0;30 }