51Nod 1006 最长公共子序列Lcs (输出)

来源:互联网 发布:java jdk 32位 编辑:程序博客网 时间:2024/06/05 17:40

1006最长公共子序列Lcs
基准时间限制:1 秒 空间限制:131072 KB 分值:0难度:基础题
收藏
关注
取消关注
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:

abcicba
abdkscab

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

大牛博客:http://blog.csdn.net/u013074465/article/details/45392687

老生常谈的问题

#include<iostream>#include<algorithm>#include<map>#include<cstring>#include<vector>#include<cmath>#include<cstdio>using namespace std;int main(){char a[1001],b[1001];gets(a),gets(b);int n=strlen(a),m=strlen(b);static int f[1001][1001]={0};int maxn=0;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(a[i-1]==b[j-1]){f[i][j]=f[i-1][j-1]+1;}else f[i][j]=max(f[i-1][j],f[i][j-1]);}} char out[1001];int cnt=0;for(int i=n,j=m;i>=1&&j>=1;){if(a[i-1]==b[j-1]){out[cnt++]=a[i-1];i--,j--;}else{if(f[i][j-1]>f[i-1][j]){j--;}else i--;}}for(cnt--;cnt>=0;cnt--){cout<<out[cnt];}return 0;}

原创粉丝点击