最长公共子序列Lcs (dp)

来源:互联网 发布:西安理工大学知行 编辑:程序博客网 时间:2024/05/17 22:18
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:

abcicba
abdkscab

ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input
第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)
Output
输出最长的子序列,如果有多个,随意输出1个。
Sample Input
abcicba
abdkscab
Sample Output

abca


AC代码:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>#include<string>#include<queue>#include<set>#include<vector>#include<map>#include<stack>#include<cstdlib>using namespace std;typedef long long ll;char a[1005],b[1005],ans[1005];int dp[1005][1055];int Max(int a,int b,int c){return max(a,max(b,c));}int main(){    scanf("%s%s",a+1,b+1);    int la=strlen(a+1);    int lb=strlen(b+1);//  printf("%d %d\n",la,lb);    for(int i=1;i<=la;i++)        dp[i][0]=0;    for(int i=1;i<=lb;i++)        dp[0][i]=0;    for(int i=1;i<=la;i++)        for(int j=1;j<=lb;j++){            if(a[i]==b[j])dp[i][j]=dp[i-1][j-1]+1;            else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);        }    int k=dp[la][lb];//    printf("%d\n",k);    int i=la,j=lb;//  printf("%d %d\n",i,j);//    printf("%c\n",a[i]);    while(i>0&&j>0){        if(a[i]==b[j]){            ans[k--]=a[i];            i--;            j--;        }        else if(dp[i-1][j]>dp[i][j-1])i--;        else j--;    }    for(int r=1;r<=dp[la][lb];r++)        printf("%c",ans[r]);    printf("\n");    return 0;}



原创粉丝点击