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 ...
随机推荐
- VS2010Datatable查看器查看超时(Microsoft.VisualStudio.DebuggerVisualizers)
这个问题由来已久,却一直没有找到原因.大家都知道,VisualStudio的DebuggerVisualizers是一个非常方便的插件,可以帮助我们调试时查看Datatable视图,前阵子突然发现在查 ...
- 洛谷P1553数字反转升级版
题目链接:https://www.luogu.org/problemnew/show/P1553
- SetUnhandledExceptionFilter
SetUnhandledExceptionFilter 设置未捕获异常处理 通常windows程序长时间运行,会发生各种问题,例如访问异常,内存溢出,堆栈破坏等. 这时候通常希望程序自己能增加处理,而 ...
- leetcode 【 Insertion Sort List 】 python 实现
题目: Sort a linked list using insertion sort. 代码:oj测试通过 Runtime: 860 ms # Definition for singly-linke ...
- Mybatis使用- Mybatis JdbcType与Oracle、MySql数据类型对应列表 ; Mybatis中javaType和jdbcType对应关系
Mybatis JdbcType与Oracle.MySql数据类型对应列表 Mybatis JdbcType Oracle MySql JdbcType ARRAY JdbcType BIG ...
- [oldboy-django][2深入django]ORM操作
推荐学习博客:http://www.cnblogs.com/wupeiqi/articles/6216618.html 需求: 汇总django orm操作,代替原生mysql语句来操作数据库:里面内 ...
- android下拉弹出动画
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http:// ...
- PAT1039
小红想买些珠子做一串自己喜欢的珠串.卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖.于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子 ...
- hibernate级联查询映射的两种方式
Hibernate主要支持两种查询方式:HQL查询和Criteria查询.前者应用较为广发,后者也只是调用封装好的接口. 现在有一个问题,就是实现多表连接查询,且查询结果集不与任何一个实体类对应,怎么 ...
- 项目记事【StreamAPI】:使用 StreamAPI 简化对 Collection 的操作
最近项目里有这么一段代码,我在做 code-review 的时候,觉得可以使用 Java8 StreamAPI 简化一下. 这里先看一下代码(不是源码,一些敏感信息被我用其他类替代了): privat ...