51nod最长公共子序列问题

来源:互联网 发布:mac怎么设置用户名 编辑:程序博客网 时间:2024/06/05 11:07
输入

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

输出

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

输入示例

abcicbaabdkscab

输出示例

abca

代码如下:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;char str1[1010];char str2[1010];int dp[1010][1010];int flag[1010][1010];char str3[1010];int main(){        scanf("%s%s",str1,str2);        memset(dp,0,sizeof(dp));        memset(flag,0,sizeof(flag));int i,j;int len1=strlen(str1);int len2=strlen(str2);for(i=1;i<=len1;i++)for(j=1;j<=len2;j++){    if(str1[i-1]==str2[j-1]){dp[i][j]=dp[i-1][j-1]+1;                flag[i][j]=1;}else{dp[i][j]=max(dp[i][j-1],dp[i-1][j]);//因为此题需要将最长公共子序列打印出来,所以需要给每一种情况标记if(dp[i][j]==dp[i][j-1])flag[i][j]=2;else if(dp[i][j]==dp[i-1][j])flag[i][j]=3;}}         int m=0;         while(len1>0&&len2>0)         {         if(flag[len1][len2]==1)         {         str3[m++]=str1[len1-1];//因为最长公共子序列不唯一,所以输出任意一种情况就可以了         len1--;         len2--; } else if(flag[len1][len2]==2)  len2--; else if(flag[len1][len2]==3)  len1--; } for(i=m-1;i>=0;i--) printf("%c",str3[i]); printf("\n");}

0 1