51Nod 1006:最长公共子序列Lcs(打印LCS)
第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)
输出最长的子序列,如果有多个,随意输出1个。
abcicba
abdkscab
abca
利用递归来实现对字符串的输出,在输入字符串a,b之后利用状态转移方程进行处理,再用一个数组进行该状态的标记,最后在递归函数里来进行操作
// 状态转移方程:
// if( s[i]==t[j] )
// dp[i+1][j+1] = dp[i][j] + 1;
// else
// dp[i+1][j+1] = max(dp[i+1][j], dp[i][j+1]);
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000 + 10;
char a[maxn], b[maxn], k[maxn];
int dp[maxn][maxn];
int stal[maxn][maxn];//标记两个位置的字母是否相同,相同为0,不同为1
void Print(int i, int j)
{
if( i==0 || j==0 ) return ;
if( !stal[i][j] )//如果a[i]和b[j]子母相同,输出
{
Print(i-1, j-1);
printf("%c", a[i-1]);
}
else if( stal[i][j]==1 )//如果dp[i-1][j]>dp[i][j-1]
Print(i-1, j);
else//如果dp[i][j-1]>=dp[i-1][j]
Print(i, j-1);
}
int main()
{
gets(a);
gets(b);
int len1 = strlen(a), len2 = strlen(b);
// 用stal数组对a,b数组的元素和状态转移方程进行标记
for( int i=1; i<=len1; i++ )
{
for( int j=1; j<=len2; j++ )
{
if( a[i-1]==b[j-1] )
{
dp[i][j] = dp[i-1][j-1] + 1;
stal[i][j] = 0;
}
else
{
if( dp[i-1][j]>dp[i][j-1] )
{
dp[i][j] = dp[i-1][j];
stal[i][j] = 1;
}
else
{
dp[i][j] = dp[i][j-1];
stal[i][j] = -1;
}
}
}
}
Print(len1, len2);
return 0;
}
51Nod 1006:最长公共子序列Lcs(打印LCS)的更多相关文章
- 51nod 1006 最长公共子序列Lcs 【LCS/打印path】
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...
- 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是这两个字符串最 ...
- (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> ...
- 1006 最长公共子序列Lcs
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdks ...
- 【51NOD】1006 最长公共子序列Lcs(动态规划)
给出两个字符串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 ...
随机推荐
- Redis Python开发指南
redis基本命令 String set setex psetex mset mget getset getrange setrange setbit getbi ...
- VS异常--未找到与约束 ContractName Microsoft.VisualStudio.Language.Intellisense.IGlyphService RequiredTypeIdentity
早上打开项目的时候突然遇到这么个错误: ======================= 未找到与约束 ContractName Microsoft.VisualStudio.Language.Inte ...
- Python numpy有什么用?
NumPy is the fundamental package for scientific computing with Python.就是科学计算包. a powerful N-dimensio ...
- oracle定时器job的使用
对于DBA来说,数据库Job再熟悉不过了,因为经常要数据库定时的自动执行一些脚本,或做数据库备份,或做数据的提炼,或做数据库的性能优化,包括重建索引等等的工作.但是,Oracle定时器Job时间的处理 ...
- Windows 2008 系统IIS安装配置
win8下安装IIS 1.右键“我的电脑”,选择“管理”,打开“服务器管理 器, 如下图: 2.点击左边菜单栏中的“角色“,弹出角色窗口,如下图: 3. 点击“添加角色”,弹出“添加角色向导”界面,如 ...
- oracle数据库中导入Excel表格中的数据
1.点击[工具]-->[ODBC 导入器],如图: 2.在导入器里选择第一个[来自ODBC的数据],用户名/系统DSN-->填写[Excel Files],输入用户名和密码,点击 [连接] ...
- 自动化运维工具SaltStack安装配置
SaltStack是一种全新的基础设置管理方式,部署轻松,在几分钟内可运作起来,扩展性好,很容易管理上万台服务器,速度够快,服务器之间秒级通讯.通过部署SaltStack环境,我们可以在成千上万台服务 ...
- 20145219《网络对抗》PC平台逆向破解
20145219<网络对抗>PC平台逆向破解 shellcode注入 1.shellcode shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 2.构造方法 (1) ...
- [BZOJ1877][SDOI2009]SuperGCD
题目大意 求两个个高精度数的gcd 题目解析 在学习gcd的时候,书上就记载了"更相减损术"这一方法 基于这种方法,我们进行优化,使得我们能快速求出两个大数的gcd 对于 \(a, ...
- codevs 1690 开关灯 线段树+延迟标记
1690 开关灯 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这 ...