/* 最长公共子序列 */ #include<iostream> #include<string> #define max(x, y) a>b?a:b #define For(t, i, j) for(t = i; t <= j; t++) #define MAXM 100 #define MAXN 100 using namespace std; int c[MAXM][MAXN], b[MAXM][MAXN]; string x, y; void Print_LCS(int i, int j) { if(i == 0 || j == 0) return; if(b[i][j] == 1) { Print_LCS(i-1, j-1); cout<<x[i-1]; } else if(b[i][j] == 2) Print_LCS(i-1, j); else Print_LCS(i, j-1); } void LCS() { int i, j, m = x.length(), n = y.length(); For(i, 0, m) c[i][0] = 0; For(j, 0, n) c[0][j] = 0; For(i, 1, m) For(j, 1, n) { if(x[i-1] == y[j-1]) { c[i][j] = c[i-1][j-1] + 1; b[i][j] = 1;//左上 } else if(c[i-1][j] >= c[i][j-1]) { c[i][j] = c[i-1][j]; b[i][j] = 2;//正上 } else { c[i][j] = c[i][j-1]; b[i][j] = 3;//左 } } cout<<"最长为:"<<c[m][n]<<endl; Print_LCS(m, n); cout<<endl; } int main() { // abcbdab bdcaba cin>>x>>y; LCS(); system("pause"); return 0; }