基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
 收藏
 关注
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。

比如两个串为:

abcicba
abdkscab

ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input
第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)
Output
输出最长的子序列,如果有多个,随意输出1个。
Input示例
abcicba
abdkscab
Output示例
abca
解体思路:
先跑LCS,注意开始的下标。多出来一行一列。其实不用flag[][]数组标记位置,回溯的时候再判断,这道
题也能做,但容易超时,因为需要重新比较,方向也不能完全确定。所以以空间换时间,开辟新的数组
标记,分为3个不同的方向来源,1代表左上,2代表正上,3代表正左,这样倒推求序列的时候方向就
能够唯一确定下来,减少了不必要的比较计算和重新探索。

源代码:
<span style="font-size:18px;">#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<cstring>
#include<string>
using namespace std; char a[1005];
char b[1005];
char c[1005];//用来保存结果
int dp[1005][1005];
int flag[1005][1005];
int index; void LCS(int len_a, int len_b)
{
memset(dp,0,sizeof(dp));
memset(flag,0,sizeof(flag));
int i,j;
for(i = 1; i <= len_a; i++)
{
for(j = 1; j <= len_b; j++)
{
if(a[i - 1] == b[j - 1])
{
dp[i][j] = dp[i - 1][j - 1] +1;
flag[i][j] = 1;
}
else if(dp[i][j - 1] > dp[i - 1][j])
{
dp[i][j] = dp[i][j - 1];
flag[i][j] = 2;
}
else
{
dp[i][j] = dp[i - 1][j];
flag[i][j] = 3;
}
}
}
} void getLCS(int n, int m)
{
while(n>0&&m>0)
{
if(flag[n][m] == 1)
{
c[index++] = a[n - 1];
n--;
m--;
}
else if(flag[n][m] == 2)
{
m--;
}
else if(flag[n][m] == 3)
{
n--;
}
}
}
void printLCS()
{
int i;
for(i = index - 1; i >= 0; i--)
printf("%c",c[i]);
printf("\n");
} int main()
{
int len_a,len_b;
scanf("%s%s",a,b);
len_a = strlen(a);
len_b = strlen(b);
LCS(len_a, len_b);
index = 0;//结果的下标
getLCS(len_a, len_b);
printLCS();
return 0;
}
</span>

51Nod--1006 lcs的更多相关文章

  1. 51Nod 1006:最长公共子序列Lcs(打印LCS)

    1006 最长公共子序列Lcs  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...

  2. 51nod 1006 最长公共子序列Lcs 【LCS/打印path】

    1006 最长公共子序列Lcs  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...

  3. 51nod 1006:最长公共子序列Lcs

    1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...

  4. 51nod 1006 最长公共子序列Lcs(经典动态规划)

    传送门 Description 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的).   比如两个串为:   abcicba abdkscab   ab是两个串的子序列,abc也是 ...

  5. 最长公共子序列Lcs (51Nod - 1006)

    20180604   11:28   给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的).   比如两个串为:   abcicba abdkscab   ab是两个串的子序列,ab ...

  6. 51Nod - 1006 最长公共子序列Lcs模板

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的).   比如两个串为:   abcicba abdkscab   ab是两个串的子序列,abc也是,abca也是,其中abca是这 ...

  7. 【模板】51nod 1006 最长公共子序列Lcs

    [题解] dp转移的时候记录一下,然后倒着推出答案即可. #include<cstdio> #include<cstring> #include<algorithm> ...

  8. 51Nod 1006 最长公共子序列Lcs问题 模板题

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为:   abcicba abdkscab   ab是两个串的子序列,abc也是,abca也是,其中abca是这两个 ...

  9. 51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最 ...

  10. 51nod 1732 LCS变形

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1732 1732 51nod婚姻介绍所 题目来源: 原创 基准时间限制:1 ...

随机推荐

  1. LeetCode 380. Insert Delete GetRandom O(1) (插入删除和获得随机数 常数时间)

    Design a data structure that supports all following operations in average O(1) time. insert(val): In ...

  2. .2-Vue源码起步(2)

    接着第一节开始继续吧(GoGoGo) 上一节把mergeOptions函数弄完了,最后返回一个options赋给了vm.$options. 这一节继续跑代码: function initMixin(V ...

  3. 独热编码OneHotEncoder简介

    在分类和聚类运算中我们经常计算两个个体之间的距离,对于连续的数字(Numric)这一点不成问题,但是对于名词性(Norminal)的类别,计算距离很难.即使将类别与数字对应,例如{'A','B','C ...

  4. CodeForces - 294A Shaass and Oskols

    //////////////////////////////////////////////////////////////////////////////////////////////////// ...

  5. 网络基础一 交换机 路由器 OSI7层模型

    第1章 网络基础 1.1 网络的出现 解决计算机通讯的需求 实现计算机信息可以传递 1.2 主机之间实现通讯基本要求(三要素) ①. 需要在两台主机之间建立物理连接,物理连接的方式有网线 光纤线 wi ...

  6. AngularJS学习篇(十四)

    AngularJS 事件 ng-click 指令 ng-click 指令定义了 AngularJS 点击事件. <!DOCTYPE html> <html> <head& ...

  7. MySQL数据库中文变问号

    原文参考:http://www.linuxidc.com/Linux/2017-05/144068.htm 系统是的Ubuntu  16,修改以下配置 1.sudo vi /etc/mysql/my. ...

  8. Struts2知识整理

    准备找工作了.好忐忑!!! 整理整理知识,好好准备. 其实现在Struts2好像不是特别流行,不过还是有用武之地的. struts2简介 struts2是基于mvc开发模型的框架,属于表现层框架 核心 ...

  9. OpenCV畸变校正源代码分析

    图像算法中会经常用到摄像机的畸变校正,有必要总结分析OpenCV中畸变校正方法,其中包过普通针孔相机模型和鱼眼相机模型fisheye两种畸变校正方法. 普通相机模型畸变校正函数针对OpenCV中的cv ...

  10. ldap数据库--ODSEE--卸载

    针对ldap实例的卸载,即删除,可以通过管理界面进行操作也可以通过命令行进行操作.卸载顺序为ldap实例--agent--ads.这里主要介绍命令操作步骤 1,ldap实例卸载 从ads注销,即不在需 ...