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 ...
随机推荐
- Which adidas NMD Singapore is your favorite
The adidas NMD Singapore just keeps the hits coming this fall with another change that's sure to bec ...
- C# Winform backgroundWorker组件使用
BackgroundWorker 组件用来执行诸如数据库事务.文件下载等耗时的异步操作. 开始 在应用程序中添加一个BackgroundWorker实例,如果用的是VS,可以从工具上直接拖到应用程序: ...
- SpringBoot 通过自定义注解实现AOP切面编程实例
一直心心念的想写一篇关于AOP切面实例的博文,拖更了许久之后,今天终于着手下笔将其完成. 基础概念 1.切面(Aspect) 首先要理解‘切’字,需要把对象想象成一个立方体,传统的面向对象变成思维,类 ...
- VS2010/MFC编程入门之六(对话框:创建对话框模板和修改对话框属性)
鸡啄米在上一讲中介绍了MFC的消息映射机制,属于原理方面的知识.对于VC++编程入门学习者来说可能有些抽象,鸡啄米会把消息映射的知识渗透到后面的教程中.本节开始为大家讲解偏应用的知识-创建对话框. 对 ...
- Codeforces Round #520 (Div. 2) Solution
A. A Prank Solved. 题意: 给出一串数字,每个数字的范围是$[1, 1000]$,并且这个序列是递增的,求最多擦除掉多少个数字,使得别人一看就知道缺的数字是什么. 思路: 显然,如果 ...
- springcloud9----feign-client-without-hystrix
package com.itmuch.cloud; import org.springframework.boot.SpringApplication; import org.springframew ...
- 20145315 《Java程序设计》第四周学习总结
20145315 <Java程序设计>第四周学习总结 教材学习内容总结 第六章 继承与多态 6.1何谓继承 6.1.1继承共同行为 把相同的程序代码提升为父类 private String ...
- OpenCV_火焰检测——完整代码
转:http://blog.csdn.net/xiao_lxl/article/details/43307993 火焰检测小程序 前几天,偶然看到了An Early Fire-Detection Me ...
- CCNA学习指南 -开放最短路径优先OSPF(多区域部分)
在之前的介绍中,可以看到单区域OSPF对于古老的RIP的优点: 路由选择更新流量减小 使用与大型网络和链路速度不一样的网络 OSPF能够在LSDB中呈现网络拓扑结构,这使得它汇聚的速度远快于RIP. ...
- LA 6892 The Safe Secret(矩阵连乘)
https://vjudge.net/problem/UVALive-6892 题意: 给出n个数字和n个符号(+,-,*和?),?可以为+,-,*中任意一个,现在要计算出这个式子的最小值和最大值,并 ...