1006 最长公共子序列Lcs

给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。

比如两个串为:

abcicba

abdkscab

ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。

 收起

输入


第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000)


输出


输出最长的子序列,如果有多个,随意输出1个。


输入样例


abcicba abdkscab


输出样例


abca


#include <iostream>
#include <map>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std ;
typedef long long LL;
const LL inf = 0x3f3f3f3f3f3f3f3f;
const LL maxn = 1e18+999 ;
const int MAX = 55005 ;
int n ;
string a , b ;
int DP[1005][1005] ;
char p[MAX] ;
int cnt ;
int main () {

cin >> a >>b ;
int lena = a.size() ;
int lenb = b.size() ;
for(int i = 1; i <= lena; i++)
for(int j = 1; j <= lenb; j++){
if(a[i-1] == b[j-1] ){
DP[i][j] = max(DP[i][j], DP[i - 1][j - 1] + 1);
}
else {
DP[i][j] = max(DP[i][j - 1], DP[i - 1][j]);
}
}
int len = DP[lena][lenb] ;
p[len] = '\0' ;
int i = lena , j = lenb ;
while(DP[i][j]) {
if(DP[i][j] == DP[i-1][j]) i-- ;
else if (DP[i][j] == DP[i][j-1]) j-- ;
else {
p[--len] = a[i-1] ;
i-- ;
j-- ;
}
}
cout<<p ;
return 0 ;

}