1 /*
2 LCS
3
4 BDCABA
5 ABCBDAB
6
7 dp[1][2] = 1
8 dp[1][1] = 0
9 dp[2][1] = 0
10
11 //子串:连续
12 //子序列:可以不连续
13 // LCS
14
15 dp[i][j]//第一个字符串在第i个字符前且第二个串在第j个字符前可构成的最长子序列的长度
16
17 dp[i][j] = 0 i=0 || j=0
18 dp[i-1][j-1]+1 str1[i]==str2[j]
19 max(dp[i-1][j],dp[i][j-1]) str1[i]!=str2[j]
20 */
21 #include<cstdio>
22 #include<cstring>
23 #include<stack>
24 #include<algorithm>
25 using namespace std;
26 int main()
27 {
28 char str1[20];
29 char str2[20];
30 scanf ("%s %s",str1+1,str2+1);
31 str1[0] = str2[0] = '0';
32 int l1 = strlen(str1)-1;
33 int l2 = strlen(str2)-1;
34 int dp[20][20] = {0};//0 i=0 || j=0
35
36 for (int i = 1 ; i <= l1 ; i++)
37 {
38 for (int j = 1 ; j <= l2 ; j++)
39 {
40 if (str1[i] == str2[j])//dp[i-1][j-1]+1 str1[i]==str2[j]
41 dp[i][j] = dp[i-1][j-1] + 1;
42 else
43 dp[i][j] = max(dp[i-1][j],dp[i][j-1]);//max(dp[i-1][j],dp[i][j-1]) str1[i]!=str2[j]
44 }
45 }
46
47 //回溯求LCS
48 int pos1 = l1;
49 int pos2 = l2;
50 stack<char> S;
51 while (pos1 > 0 && pos2 > 0)
52 {
53 if (str1[pos1] == str2[pos2])
54 {
55 S.push(str1[pos1]);
56 pos1--;
57 pos2--;
58 }
59 else if (dp[pos1-1][pos2] > dp[pos1][pos2-1])
60 pos1--;
61 else
62 pos2--;
63 }
64 while (!S.empty())
65 {
66 printf ("%c%c",S.top(),(S.size() == 1) ? '\n' : ' ');
67 S.pop();
68 }
69 printf ("%d\n",dp[l1][l2]);
70 return 0;
71 }