输入

第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)
输出
 
输出最长的子序列,如果有多个,随意输出1个。
 
输入示例

abcicba
abdkscab

输出示例

abca
 1 #include<algorithm>
 2 #include<iostream>
 3 #include<limits.h>
 4 #include<stdlib.h>
 5 #include<string.h>
 6 #include<complex>
 7 #include<cstring>
 8 #include<iomanip>
 9 #include<stdio.h>
10 #include<bitset>
11 #include<cctype>
12 #include<math.h>
13 #include<string>
14 #include<time.h>
15 #include<vector>
16 #include<cmath>
17 #include<queue>
18 #include<stack>
19 #include<list>
20 #include<map>
21 #include<set>
22 
23 #define LL long long
24 
25 using namespace std;
26 const LL mod = 1e9 + 7;
27 const double PI = acos(-1.0);
28 const double E = exp(1.0);
29 const int M = 1e3 + 10;
30 
31 string s1;
32 string s2;
33 string s;
34 int dp[M][M];
35 
36 
37 int main()
38 {
39     while( cin >> s1 >> s2 ){
40     int len1 = s1.size();
41     int len2 = s2.size();
42     s1 = "#" + s1;
43     s2 = "#" + s2;
44     memset(dp, 0, sizeof(dp));
45     s.clear();
46     for(int i = 1; i <= len1; ++i)
47         for(int j = 1; j <= len2; ++j){
48             if(s1[i] == s2[j])
49                     dp[i][j] = dp[i - 1][j - 1] + 1;
50             else
51                 dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
52         }
53     for(int i = len1, j = len2; i && j; --i, --j){
54         if(s1[i] == s2[j])
55             s += s1[i];
56         else{
57             if(dp[i][j - 1] > dp[i - 1][j])
58                 i++;
59             else
60                 j++;
61         }
62     }
63     if(dp[len1][len2] == 0)
64         continue;
65     for(int i = s.size() - 1; i >= 0; --i)
66         cout << s[i];
67     cout << endl;
68     }
69     return 0;
70 }

 

posted on 2015-08-04 21:29  Unico  阅读(123)  评论(0)    收藏  举报