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

比如两个串为:

abcicba
abdkscab

ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input
  1. 1行:字符串A
  2. 2行:字符串B
  3. (A,B的长度 <= 1000)
Output
  1. 输出最长的子序列,如果有多个,随意输出1个。
Input示例
  1. abcicba
  2. abdkscab
Output示例
  1. abca
  1. 解体思路:
  1. 先跑LCS,注意开始的下标。多出来一行一列。其实不用flag[][]数组标记位置,回溯的时候再判断,这道
  1. 题也能做,但容易超时,因为需要重新比较,方向也不能完全确定。所以以空间换时间,开辟新的数组
  1. 标记,分为3个不同的方向来源,1代表左上,2代表正上,3代表正左,这样倒推求序列的时候方向就
  1. 能够唯一确定下来,减少了不必要的比较计算和重新探索。
  1.  
  1. 源代码:
  1. <span style="font-size:18px;">#include<iostream>
  2. #include<stdio.h>
  3. #include<algorithm>
  4. #include<string.h>
  5. #include<cstring>
  6. #include<string>
  7. using namespace std;
  8. char a[1005];
  9. char b[1005];
  10. char c[1005];//用来保存结果
  11. int dp[1005][1005];
  12. int flag[1005][1005];
  13. int index;
  14. void LCS(int len_a, int len_b)
  15. {
  16.     memset(dp,0,sizeof(dp));
  17.     memset(flag,0,sizeof(flag));
  18.     int i,j;
  19.     for(i = 1; i <= len_a; i++)
  20.     {
  21.         for(j = 1; j <= len_b; j++)
  22.         {
  23.             if(a[i - 1] == b[j - 1])
  24.             {
  25.                 dp[i][j] = dp[i - 1][j - 1] +1;
  26.                 flag[i][j] = 1;
  27.             }
  28.             else if(dp[i][j - 1] > dp[i - 1][j])
  29.             {
  30.                 dp[i][j] = dp[i][j - 1];
  31.                 flag[i][j] = 2;
  32.             }
  33.             else
  34.             {
  35.                 dp[i][j] = dp[i - 1][j];
  36.                 flag[i][j] = 3;
  37.             }
  38.         }
  39.     }
  40. }
  41. void getLCS(int n, int m)
  42. {
  43.     while(n>0&&m>0)
  44.     {
  45.         if(flag[n][m] == 1)
  46.         {
  47.             c[index++] = a[n - 1];
  48.             n--;
  49.             m--;
  50.         }
  51.         else if(flag[n][m] == 2)
  52.         {
  53.             m--;
  54.         }
  55.         else if(flag[n][m] == 3)
  56.         {
  57.             n--;
  58.         }
  59.     }
  60. }
  61. void printLCS()
  62. {
  63.     int i;
  64.     for(i = index - 1; i >= 0; i--)
  65.         printf("%c",c[i]);
  66.     printf("\n");
  67. }
  68. int main()
  69. {
  70.     int len_a,len_b;
  71.     scanf("%s%s",a,b);
  72.     len_a = strlen(a);
  73.     len_b = strlen(b);
  74.     LCS(len_a, len_b);
  75.     index = 0;//结果的下标
  76.     getLCS(len_a, len_b);
  77.     printLCS();
  78.     return 0;
  79. }
  80. </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. JS插入新的节点

    insertBefore() 语法: insertBefore(newchild,refchild) newchild 插入新的节点 refchild 在此节点前插入新节点 <ul id=&qu ...

  2. .1-Vue源码起步

    搞事!搞事! 截止2017.5.16,终于把vue的源码全部抄完,总共有9624行,花时大概一个月时间,中间迭代了一个版本(2.2-2.3),部分代码可能不一致,不过没关系! 上一个链接https:/ ...

  3. Vue-cli安装教程

    第一步:安装vue-cli npm install vue-cli -g -g :代表全局安装.如果你安装时报错,一般是网络问题,你可以尝试用cnpm来进行安装. 检测是否安装成功:可以用vue -V ...

  4. ES6新特性之解构使用细节

    ES6的解构说白了就是能够让我们一次性取到多个值,大致可分为一下几个方面 1.数组解构 普通的一维数组解构,如下one = array[0],two=array[1],three=array[2] v ...

  5. spark三种连接Join

    本文主要介绍spark join相关操作. 讲述spark连接相关的三个方法join,left-outer-join,right-outer-join,在这之前,我们用hiveSQL先跑出了结果以方便 ...

  6. 借助csv用PHP生成excel文件

    当你将xml文件改为csv后缀会发现原先的表格结构都变成用逗号隔开的一行一行数据,就像这样 编号,姓名,年龄 001,王宇,28 002,刘三,20 由此看来,如果能将PHP数据输出为这样的格式,然后 ...

  7. Problem E: 可变长数组

    Problem E: 可变长数组 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 472  Solved: 368[Submit][Status][Web ...

  8. riot.js教程【三】访问DOM元素、使用jquery、mount输入参数、riotjs标签的生命周期

    前文回顾 riot.js教程[二]组件撰写准则.预处理器.标签样式和装配方法 riot.js教程[一]简介 访问DOM元素 你可以通过this.refs对象访问dom元素 而且还有大量的属性简写方式可 ...

  9. rem布局配合less的快速开发

    最近在进行静态页面的制作,为了方便和快速的布局,自己整理了一套工具可以快速的进行工作,剩余的时间大家都懂的,话不多说,来看具体的东西吧! 1.ps 下载这个软件→cutterman 十分强大的切图功能 ...

  10. 《Linux命令行与shell脚本编程大全》 第八章管理文件系统

    8.1 探索linux文件系统 8.1.1 基本的Linux文件系统 ext:最早的文件系统,叫扩展文件系统.使用虚拟目录操作硬件设备,在物理设备上按定长的块来存储数据. 用索引节点的系统来存放虚拟目 ...