最长公共子序列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 }

 

posted @ 2017-07-15 10:16  starry_sky  阅读(146)  评论(0编辑  收藏  举报