UVA 10405 Longest Common Subsequence (动态规划 LCS)
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 aedfhris 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
a1b2c3d4e zz1yy2xx3ww4vv abcdgh aedfhr abcdefghijklmnopqrstuvwxyz a0b0c0d0e0f0g0h0i0j0k0l0m0n0o0p0q0r0s0t0u0v0w0x0y0z0 abcdefghijklmnzyxwvutsrqpo opqrstuvwxyzabcdefghijklmn
Output for the sample input
4 3 26 14
题目大意:求最长公共子序列
设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 # include<stdio.h> 2 # include<string.h> 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 }
把每一件简单的事情做好,就是不简单;把每一件平凡的事情做好,就是不平凡!相信自己,创造奇迹~~