51 Nod 1006 最长公共子序列(LCS & DP)
原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1006
题目分析:
首先先知道LCS问题,这有两种:
- Longest Common Substiring —- 最长公共子串
- Longest Common Sequence —- 最长公共子序列
这两者的区别是:前者必须是原字符串中连续的一段,后者可以是在原字符串中随意抽取的一些字符串拼凑成的字符串,只需要遵守顺序即可也就是说:子串字符的位置必须是连续的,子序列不必连续。
这道题目主要考的就是动态规划,具体思路如下:先求出最长公共子序列的长度,然后再根据最长公共子序列的长度逆序求出最长公共子序列。
如果还是理解有些困难的话,可以参考这个递推式:
代码如下:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
char a[1005], b[1005];
int dp[1005][1005], la, lb;
void lcs() { // 求最长公共子序列长度
for (int i = 1; i <= la; i++) {
for (int j = 1; j <= lb; j++) {
if (a[i - 1] == b[j - 1])
dp[i][j] = dp[i - 1][j - 1] + 1;
else
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
void solve() { // 逆序求出最长公共子序列
lcs();
int flag = dp[la][lb];
char ans[1005] = {'\0'};
while (la && lb) {
if (a[la - 1] == b[lb - 1] && dp[la][lb] == dp[la - 1][lb - 1] + 1) {
ans[--flag] = a[la - 1];
la--;
lb--;
} else if (a[la - 1] != b[lb - 1] && dp[la - 1][lb] > dp[la][lb - 1]) {
la--;
} else
lb--;
}
cout << ans << endl;
}
int main() {
while (cin >> a >> b) {
memset(dp, 0, sizeof(dp));
la = strlen(a);
lb = strlen(b);
solve();
}
return 0;
}
51 Nod 1006 最长公共子序列(LCS & DP)的更多相关文章
- 51 nod 1006 最长公共子序列Lcs
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1006 参考博客 :http://blog.csdn.net/yysdsy ...
- 1006 最长公共子序列Lcs
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdks ...
- 51nod 1006 最长公共子序列Lcs 【LCS/打印path】
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...
- 51Nod - 1006 最长公共子序列Lcs模板
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这 ...
- 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是这两个字符串最 ...
- 【51NOD-0】1006 最长公共子序列Lcs
[算法]经典DP [题解]经典lcs,输出路径可以记录上一个有效节点就是有点麻烦. 因为开始时写法不太明确,打印结果时初始循环地方搞错了,后来修正写法时忘了改过来,调了好久. #include< ...
随机推荐
- [BUUCTF]PWN——[BJDCTF 2nd]secret
[BJDCTF 2nd]secret 附件 步骤: 例行检查,64位程序,开启了canary和nx 本地试运行一下,看看程序大概的情况,好像是一个什么游戏 64位ida载入,检索程序里的字符串,发现了 ...
- [BUUCTF]REVERSE——[GXYCTF2019]luck_guy
[GXYCTF2019]luck_guy 附件 步骤: ida载入,shift+f12查看程序里的字符串,看到了关于flag的提示 双击跟进跳转,ctrl+x找到关键函数 flag是由f1和f1拼接而 ...
- TMS570LS3137笔记-内部Flash FEE使用
1.基本简介 TMS570LS3137内部Flash分为三个 Bank,主Flash 数据存储区3MB,是Bank1和Bank2.还有一个Bank7是作为内部Flash模拟EEPROM使用.内部存储器 ...
- 如何高效地把Spring boot学到能干活的程度
Spring boot要学什么?要学到什么程度?以及相关的学习方法是什么?这些很难量化,但极好形容:需要学到能帮你找到一份工作的程度. 任何脱离工作脱离实际的学习,都是没有意义的.比如程序员运行通 ...
- HSPICE与非门仿真
一.HSPICE的基本操作过程 打开HSPICE程序,通过OPEN打开编写好的网表文件. 按下SIMULATE进行网表文件的仿真. 按下AVANWAVES查看波形图(仿真结果). 二. 网表文件结构总 ...
- CF1492B Card Deck 题解
Content 有 \(n\) 张纸牌组成的一个牌堆,每张纸牌都有一个价值 \(p_1,p_2,\dots,p_n\).每次选出最顶上的几个牌放到另外一个一开始为空的牌堆里面.定义一个牌堆的总值为 \ ...
- 实体转为json的,如何处理外键情况
实体转为json的,如何处理外键情况 jc.registerJsonValueProcessor(Userrelation.class, new JsonValueProcessor() {// 此处 ...
- ACwing1208. 翻硬币
题目: 小明正在玩一个"翻硬币"的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情形是:**oo***oooo 如果 ...
- JS判断是否为“YYYYMMDD”式的日期
function isDate8(sDate) { if (!/^[0-9]{8}$/.test(sDate)) { return false; } var year, month, day; yea ...
- JAVA使用反射获取对象的所有属性名
public static void main(String[] args) { Field[] fields=BaseSalary.class.getDeclaredFields(); for (i ...