51Nod 1006 最长公共子序列Lcs
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:
abcicba
abdkscab
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input
第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000)
Output
输出最长的子序列,如果有多个,随意输出1个。
Input示例
abcicba abdkscab
Output示例
abca
1 #include <stdio.h> 2 #define MAXN 1002 3 char A[MAXN] = {0}; 4 char B[MAXN] = {0}; 5 char R[MAXN] = {0}; 6 short mat[MAXN][MAXN] = {0}; 7 short max(short a, short b, short c) 8 { 9 if(a > b){ 10 b = a; 11 } 12 return b > c ? b : c; 13 } 14 int main() 15 { 16 int i, j = 0, k; 17 scanf("%s %s", A + 1, B + 1); 18 for(i = 1; A[i]; i++){ 19 for(j = 1; B[j]; j++){ 20 mat[i][j] = max(mat[i-1][j], mat[i][j-1], mat[i-1][j-1] + (A[i]==B[j] ? 1 : 0)); 21 } 22 } 23 i--; 24 j--; 25 k = MAXN - 1; 26 while(i > 0 && j > 0){ 27 if(A[i] == B[j]){ 28 R[k--] = A[i]; 29 i--; 30 j--; 31 } 32 else if(mat[i-1][j] > mat[i][j-1]){ 33 i--; 34 } 35 else{ 36 j--; 37 } 38 } 39 printf( "%s\n", R + k + 1); 40 return 0; 41 }