最长公共子序列LCS
51Nod 1006
a[i][j] 为a1,a2...ai与b1,b2....bj最长的公共子序列。
1 #include <iostream> 2 #include <stdio.h> 3 using namespace std; 4 const int N = 1e3+10; 5 int a[N][N]; 6 char s[N], ss[N], sss[N]; 7 int main(){ 8 scanf("%s %s",s+1,ss+1); 9 int i,j; 10 for(i = 1; s[i]; i ++){ 11 for(j = 1; ss[j]; j ++){ 12 if(s[i] == ss[j]) a[i][j] = a[i-1][j-1] + 1; 13 else a[i][j] = max(a[i-1][j],a[i][j-1]); 14 } 15 } 16 i--;j--; 17 int k = N -1; 18 while(i > 0 && j > 0){ 19 if(s[i] == ss[j]){ 20 sss[k--] = s[i]; 21 i--;j--; 22 }else if(a[i-1][j] > a[i][j-1]){ 23 i--; 24 }else{ 25 j--; 26 } 27 } 28 printf("%s\n",sss+k+1); 29 return 0; 30 }