51nod 1006 最长公共子序列Lcs 【LCS/打印path】
第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)
输出最长的子序列,如果有多个,随意输出1个。
abcicba
abdkscab
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】的更多相关文章
- 51nod 1006 最长公共子序列Lcs(经典动态规划)
传送门 Description 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是 ...
- 51Nod - 1006 最长公共子序列Lcs模板
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这 ...
- 51Nod 1006 最长公共子序列Lcs问题 模板题
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个 ...
- 51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最 ...
- 51 Nod 1006 最长公共子序列(LCS & DP)
原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1006 题目分析: 首先先知道LCS问题,这有两种: Long ...
- (DP)51NOD 1006 最长公共子序列&1092 回文字符串
1006 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abc ...
- 【模板】51nod 1006 最长公共子序列Lcs
[题解] dp转移的时候记录一下,然后倒着推出答案即可. #include<cstdio> #include<cstring> #include<algorithm> ...
- 【51NOD】1006 最长公共子序列Lcs(动态规划)
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个 ...
- 1006 最长公共子序列Lcs
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdks ...
随机推荐
- Codeforces Round #443 (Div. 2) C 位运算
C. Short Program time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- data相关应用
文案参考:HTML5中的data-*属性和jQuery中的.data()方法使用 data属性选择器 $("li[data-id='1']")//选择li元素中data-id属性等 ...
- 《Scrum实战》第4次课【全职的Scrum Master】作业汇总
1组: 孟帅 http://www.cnblogs.com/mengshuai1982/p/7375008.html 3组: 张亚辉 http://www.jianshu.com/p/df9eee08 ...
- 驱动模块 .ko
模块: 模块机制,作用搞高LINUX操作系统的扩充性. 1. 模块概念: 1.动态可加载内核模块LKM 2.内核空间运行 3.是不是一执行文件,是一个没有经过链接,不能独立运行的一个目标文件(.c-& ...
- 11、JQuery知识点总结
1.JQuery简介 JQuery 是一套跨浏览器的JavaScript库,简化HTML与JavaScript之间的操作 jQuery有下列特色: 跨浏览器的DOM元素选择 DOM巡访与更改:支持CS ...
- Mybatis使用-Error attempting to get column 'type' from result set. / '255' in column '4' is outside valid range for the datatype TINYINT.
一.遇到的问题是这样的: [RemoteTestNG] detected TestNG version 6.9.10log4j: Parsing for [root] with value=[DEBU ...
- 安恒杯月赛 babypass getshell不用英文字母和数字
BABYBYPASS 先贴代码: ①限制字符长度35个 ②不能使用英文字母和数字和 _ $ 最后提示有个getFlag()函数,从这个函数入手. 我们的第一思路是直接eval执行getFlag函数,但 ...
- dotfiles项目
1.dotfile介绍 在linux中的各种软件配置文件大多是以.开头,以rc结尾,在第一次使用某一个软件比如vim的时候,通常会花大量时间配置,将所有的配置文件放到同一个目录下,方便在多台机器上同步 ...
- Python-S9——Day115-Flask Web框架
01 当日内容概要 1 当日内容概要 1.1 Flask基础: 1.2 Web框架包含的基础组件: 1.2.1 路由.视图函数.模板渲染: 1.3 Flask配置文件: 1.4 Flask的路由系统: ...
- python学习-- Django进阶之路 model的 objects对象 转 json
# objects_to_json: 将 model对象 转化成 json# json_to_objects: 将 将反序列化的json 转为 model 对象 def json_field(fiel ...