基准时间限制: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示例
abcicba
abdkscab
Output示例
abca
【代码】:
#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
#define maxn 1005
#define maxm 10005
#define INF 0x3f3f3f3f
#define LL long long
using namespace std; int n,m,t;
char a[maxn],b[maxn];
int c[maxn][maxn];
int dp[maxn][maxn]; void LCS(int n, int m)
{
for(int i=; i<=n; i++){
for(int j=; j<=m; j++){
if(a[i-] == b[j-]){
dp[i][j] = dp[i-][j-]+;
c[i][j] = ;
}
else if(dp[i-][j] > dp[i][j-]){
dp[i][j] = dp[i-][j];
c[i][j] = ;
}
else{
dp[i][j] = dp[i][j-];
c[i][j] = ;
}
}
}
} void dfs(int i,int j)
{
if(!i||!j) return ;
if(c[i][j]==){
dfs(i-,j-);
printf("%c",a[i-]);
}
else if(c[i][j]==)
dfs(i-,j);
else
dfs(i,j-);
} int main()
{
cin>>a>>b; memset(c,,sizeof(c));
memset(dp,,sizeof(dp)); n=strlen(a);
m=strlen(b); LCS(n,m);
dfs(n,m);
cout<<endl;
return ;
}

1~n : 递归打印

#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
#define maxn 1005
#define maxm 10005
#define INF 0x3f3f3f3f
#define LL long long
using namespace std; int i,j;
char a[maxn];
char b[maxn];
int dp[maxn][maxn]; void LCS(int n, int m)
{
for(int i=; i<=n; i++){
for(int j=; j<=m; j++){
if(a[i-] == b[j-])
dp[i][j] = dp[i-][j-]+; else if(dp[i][j-] > dp[i-][j])
dp[i][j] = dp[i][j-];
else
dp[i][j] = dp[i-][j];
}
}
} int main()
{
scanf("%s%s",a,b); int n=strlen(a);
int m=strlen(b); LCS(n,m); int i=n;
int j=m;
int k=dp[i][j]; //倒着来
char path[maxn]={'\0'}; //逆序
while(i && j)
{
if(a[i-] == b[j-] && dp[i][j] == dp[i-][j-]+)
{
path[--k]=a[i-];//逆序
i--;
j--;
}
else if(a[i-]!=b[j-] && dp[i-][j] > dp[i][j-])
i--;
else j--;
}
printf("%s\n",path);
return ;
}

1~n : 循环打印

#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
#include<stack>
#define maxn 1005
#define maxm 10005
#define INF 0x3f3f3f3f
#define LL long long
using namespace std; int i,j;
char a[maxn];
char b[maxn];
int dp[maxn][maxn]; //void LCS(int n, int m)
//{
// for(int i=1; i<=n; i++){
// for(int j=1; j<=m; j++){
// if(a[i-1] == b[j-1])
// dp[i][j] = dp[i-1][j-1]+1;
//
// else if(dp[i][j-1] > dp[i-1][j])
// dp[i][j] = dp[i][j-1];
// else
// dp[i][j] = dp[i-1][j];
// }
// }
//} int main()
{
scanf("%s%s",a,b);
int n=strlen(a);
int m=strlen(b);
memset(dp,,sizeof(dp)); for(int i=; i<=n; i++){
for(int j=; j<=m; j++){
if(a[i-] == b[j-])
dp[i][j] = dp[i-][j-]+;
else
dp[i][j] = max(dp[i-][j],dp[i][j-]);
}
}
int i=n;
int j=m;
int k=dp[i][j];
stack<char> s;
while(k)
{
if(a[i-] == b[j-]){
s.push(a[i-]);
i--,j--;
k--;
}
else{
if(dp[i][j] == dp[i-][j]) i--;
else j--;
}
}
while(!s.empty())
{
cout<<s.top();
s.pop();
}
return ;
}
/*
abcicba
abdkscab
*/

1~n :栈打印

51nod 1006 最长公共子序列Lcs 【LCS/打印path】的更多相关文章

  1. 51nod 1006 最长公共子序列Lcs(经典动态规划)

    传送门 Description 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的).   比如两个串为:   abcicba abdkscab   ab是两个串的子序列,abc也是 ...

  2. 51Nod - 1006 最长公共子序列Lcs模板

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的).   比如两个串为:   abcicba abdkscab   ab是两个串的子序列,abc也是,abca也是,其中abca是这 ...

  3. 51Nod 1006 最长公共子序列Lcs问题 模板题

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为:   abcicba abdkscab   ab是两个串的子序列,abc也是,abca也是,其中abca是这两个 ...

  4. 51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最 ...

  5. 51 Nod 1006 最长公共子序列(LCS & DP)

    原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1006 题目分析: 首先先知道LCS问题,这有两种: Long ...

  6. (DP)51NOD 1006 最长公共子序列&1092 回文字符串

    1006 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为:   abcicba abdkscab   ab是两个串的子序列,abc也是,abca也是,其中abc ...

  7. 【模板】51nod 1006 最长公共子序列Lcs

    [题解] dp转移的时候记录一下,然后倒着推出答案即可. #include<cstdio> #include<cstring> #include<algorithm> ...

  8. 【51NOD】1006 最长公共子序列Lcs(动态规划)

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为:   abcicba abdkscab   ab是两个串的子序列,abc也是,abca也是,其中abca是这两个 ...

  9. 1006 最长公共子序列Lcs

    1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdks ...

随机推荐

  1. C++ 11 从C++ primer第五版的学习笔记

    1. auto (page107) auto 推断会忽略const   const int ci = i, & cr = ci; auto b = ci; // b is an int (to ...

  2. 【小程序入门集锦】19,微信小程序个人帐号申请

    个人账号与企业帐号相比,缺少支付等功能,与个人订阅号类似.   小程序开放个人开发者申请注册,个人用户可访问微信公众平台,扫码验证个人身份后即可完成小程序帐号申请并进行代码开发.   下面我们就来说说 ...

  3. Redis的概述、优势和安装部署

    Redis概述 Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的应用程序的完美解决方案. Redis从它的许多竞争继承来的三个主要特点: Redis数据库完全在内存中,使 ...

  4. loj6392 「THUPC2018」密码学第三次小作业 / Rsa

    还是挺好做的,\((e_1,e_2)=1 \Rightarrow e_1s+e_2t=0\),\(m \equiv m^1 \equiv m^{e_1s+e_2t} \equiv c_1^s c_2^ ...

  5. hibernate 出错 集合

    Lazy="false"反而出错 错误信息: “System.Configuration.ConfigurationErrorsException”类型的异常在 Spring.Co ...

  6. 从零开始到设计Python+Selenium自动化测试框架-如何开始

    如何开始学习web ui自动化测试?如何选择一门脚本语言?选择什么自动化测试工具? 本人已经做测试快5年,很惭愧,感觉积累不够,很多测试都不会,三年多功能测试,最近两年才开始接触和学习自动化测试.打算 ...

  7. gcc学习记录

    -Wall: 使输出中包含警告信息,提示一些可以避免的错误.如果没有错误,则不会输出信息. -o:后面加上可执行文件的名字.如果不加-o选项,会默认生成a.out可执行文件.举例:gcc -Wall ...

  8. Windows 7中安装SQL2005提示IIS未安装 解决办法 .(转载)

    在Windows 7系统中安装SQL Server 2005时,可能会收到一个警告:提示IIS未安装或者未启用.在通过“控制面板”的“打开或关闭Windows功能”按默认设置安装IIS后,发现仍有这个 ...

  9. 冒泡排序(Bubble Sort)及优化

    原理介绍 冒泡排序算法的原理如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有 ...

  10. python中 in, any 和 all用法

    in if x == 1 or y == 1 or z == 1: print('passed') if 1 in (x, y, z): print('passed') any if x or y o ...