最长公共子序列

来源:互联网 发布:织梦pc怎么做手机网站 编辑:程序博客网 时间:2024/05/16 14:25
输入

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

输出

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

输入示例

abcicbaabdkscab

输出示例

abca


dp的时候记录路径,从终点反向寻找路径即可


代码如下:

#include<stdio.h>#include<string.h>#include<cstdlib>#include <iostream>using namespace std;int dp[1005][1005];struct node{    int aa;    int bb;}path[1005][1005];int main(){    char a[1005],b[1005];    while(~scanf("%s%s",a+1,b+1)) {        int lena=strlen(a+1);        int lenb=strlen(b+1);        memset(dp,0,sizeof(dp));        int x=lena,y=lenb;        for(int i=1;i<=lena;i++) {            for(int j=1;j<=lenb;j++) {                if(a[i]==b[j]) {                    dp[i][j]=dp[i-1][j-1]+1;                    path[i][j].aa=-1;                    path[i][j].bb=-1;                }                else {                    if(dp[i-1][j]>dp[i][j-1]) {                        dp[i][j]=dp[i-1][j];                        path[i][j].aa=-1;                        path[i][j].bb=0;                    }                    else {                        dp[i][j]=dp[i][j-1];                        path[i][j].aa=0;                        path[i][j].bb=-1;                    }                }            }        }        char ans[1005];        int k=0;        while(x!=0&&y!=0) {            if(a[x]==b[y]) {                ans[k++]=a[x];            }            int xx=path[x][y].aa;            int yy=path[x][y].bb;            x+=xx;            y+=yy;        }        for(int i=k-1;i>=0;i--) {            printf("%c",ans[i]);        }        printf("\n");    }    return 0;}


0 0