51Nod - 1006 最長公共子序列Lcs模板
阿新 • • 發佈:2018-07-28
nbsp span sam lib mes 51nod deque strlen class 給出兩個字符串A B,求A與B的最長公共子序列(子序列不要求是連續的)。
比如兩個串為:
abcicba
abdkscab
ab是兩個串的子序列,abc也是,abca也是,其中abca是這兩個字符串最長的子序列。
Input
第1行:字符串A
第2行:字符串B
(A,B的長度 <= 1000)Output輸出最長的子序列,如果有多個,隨意輸出1個。
Sample Input
abcicba abdkscab
Sample Output
abca
只能求最長公共子序列的長度,不能輸出這個串是什麽
1 #include<stdio.h> 2 #include<stdlib.h> 3#include<string.h> 4 #include<math.h> 5 #include<algorithm> 6 #include<queue> 7 #include<stack> 8 #include<deque> 9 #include<iostream> 10 using namespace std; 11 typedef long long LL; 12 char str1[1009],str2[1009]; 13 int dp[1009][1009]; 14 void output(int i,intj) 15 { 16 if(i==0||j==0) 17 return ; 18 else 19 { 20 if(str1[i-1]==str2[j-1]) 21 { 22 output(i-1,j-1); 23 printf("%c",str1[i-1]); 24 } 25 else 26 { 27 if(dp[i][j-1]>=dp[i-1][j]) 28 output(i,j-1); 29 else 30 output(i-1,j); 31 32 } 33 } 34 } 35 int main() 36 { 37 int i,p,j; 38 int len1,len2; 39 40 scanf("%s%s",str1,str2); 41 memset(dp,0,sizeof(dp)); 42 len1=strlen(str1); 43 len2=strlen(str2); 44 for(i=1; i<=len1; i++) 45 for(j=1; j<=len2; j++) 46 { 47 if(str1[i-1]==str2[j-1]) 48 dp[i][j]=dp[i-1][j-1]+1; 49 else 50 dp[i][j]=max(dp[i][j-1],dp[i-1][j]); 51 } 52 output(len1,len2); 53 putchar(‘\n‘); 54 return 0; 55 }
。
51Nod - 1006 最長公共子序列Lcs模板