51Nod 1006 最长公共子序列Lcs问题 模板题
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:
abcicba
abdkscab
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input
第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000)
Output
输出最长的子序列,如果有多个,随意输出1个。
Input示例
abcicba abdkscab
Output示例
abca
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <cmath> #include <map> #include <set> #include <vector> #include <algorithm> using namespace std; #define lowbit(x) (x&(-x)) #define max(x,y) (x>y?x:y) #define min(x,y) (x<y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define PI 3.141592653589793238462 #define INF 0x3f3f3f3f3f #define mem(a) (memset(a,0,sizeof(a))) typedef long long ll; int dp[1006][1006],la,lb,k,i,j; string a,b,s; int main() { cin>>a>>b; la=a.size(); lb=b.size(); for(i=0;i<1006;i++) dp[i][0]=dp[0][i]=0; for(i=1;i<=la;i++) { for(j=1;j<=lb;j++) { if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } i--; j--; s=""; while(i>0 && j>0) { if(a[i-1]==b[j-1]) { s+=a[i-1]; i--; j--; } else if(dp[i-1][j]>dp[i][j-1]) i--; else j--; } reverse(s.begin(),s.end()); cout<<s<<endl; return 0; }