最长公共子序列 路径还原

来源:互联网 发布:阀门网络销售 编辑:程序博客网 时间:2024/04/30 04:05

输入

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

输出

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

输入示例

abcicba
abdkscab

输出示例

abca

#include<stdio.h>#include <cstring>#include <algorithm>using namespace std;const long long INF = 0x3f3f3f3f;typedef long long LL;int dp[1005][1005];char st1[1005];char st2[1005];char ans[1005];int main(){    scanf("%s",st1);    scanf("%s",st2);    int l1 = strlen(st1);    int l2 = strlen(st2);    for (int i = 1;i <= l1; ++i){        for (int j = 1;j <= l2; ++j){             if (st1[i-1]==st2[j-1]){                dp[i][j] = dp[i-1][j-1]+1;            }else dp[i][j] = max(dp[i-1][j],dp[i][j-1]);        }    }    //printf("%d\n",dp[l1][l2]);    int k = dp[l1][l2];    ans[1001] = {'\0'};    int i = l1,j = l2;    while (i&&j){        if (st1[i-1]==st2[j-1]&&dp[i][j]==dp[i-1][j-1]+1){            ans[--k] = st1[i-1];            i--;j--;        }else if (st1[i-1]!=st2[j-1]&&dp[i-1][j]>dp[i][j-1]){            i--;        }else j--;    }    printf("%s\n",ans);    return 0;}
原创粉丝点击