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 ...
随机推荐
- [bzoj1912]异象石(set)
Description Adera是Microsoft应用商店中的一款解谜游戏. 异象石是进入Adera中异时空的引导物,在Adera的异时空中有一张地图.这张地图上有N个点,有N-1条双向边把它们连 ...
- [BZOJ3684][拉格朗日反演+多项式求幂]大朋友和多叉树
题面 Description 我们的大朋友很喜欢计算机科学,而且尤其喜欢多叉树.对于一棵带有正整数点权的有根多叉树,如果它满足这样的性质,我们的大朋友就会将其称作神犇的:点权为\(1\)的结点是叶子结 ...
- Android 多线程 打地鼠游戏
前言:最近比较喜欢多线程了,看到了一些线程案例,这里总结一下打地鼠游戏的整个过程. 1.首先是主活动要加载的布局,我一般就喜欢早点把这个写上,这样就好在主活动中玩弄这些控件了.闲话不多说,一个Fram ...
- golang echo livereload
echo on port 1323 gin -a 1323 run server.go go get github.com/codegangsta/gin gin -h
- Neural Network
逻辑回归用神经网络节点的方式表示 前面已经介绍过逻辑回归的模型,样本为(x,y) 其中y的值为1或0,假设x有2个特征,则对应关系如下图所示.  实际情况是需要求需要三个参数,因此输入层需要添加一个 ...
- 友推在Android 实现微信等分享代码的常见问题
介绍,最近 做了一个项目,需要集成分享功能.果断选择 友推. 集成过程,参考友推官方提供的集成文档即可 废话不多说,主要说一下自己在集成过程中遇到的一些问题,主要有两个: 问题1. 引入youtui- ...
- Xmanager用法(export DISPLAY=客户端IP:0.0)
1.在用户的目录下找到文件.bash_profile或profile,用vi对其进行编辑.加入下列命令行: DISPLAY=192.168.88.71:0.0;export DISPLAY 2.如果只 ...
- PAT——乙级1012
1012 数字分类 (20 point(s)) 给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: A1 = 能被 5 整除的数字中所有偶数的和: A2 = 将被 5 除后 ...
- ms sqlserver数据库主文件特别大怎么办
因为项目中需要复制数据库,作为外网测试的数据库,但是数据库特别大,复制特别费劲,即使只复制主文件,主文件也特别大. 然后百度了下,发现数据库有个收缩功能,数据库右键——任务——收缩,可以对数据库进行收 ...
- java实现图的深度优先遍历和广度优先遍
首先需要知道的是,图的深度优先遍历是一种类似于树的前序遍历方式,即选择一个入口节点,沿着这个节点一直遍历下去,直至所有节点都被访问完毕:如果说,图的深度优先遍历类似于树的前序遍历的话,那么图的广度优先 ...