LCS算法妙解

LCS问题简述:最长公共子序列

一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列。

LCS问题的分支:最长公共子串与最长公共子序列

子串(Substring)是串的一个连续的部分,子序列(Subsequence)则是从不改变序列的顺序,而从序列中去掉任意的元素而获得的新序列;更简略地说,前者(子串)的字符的位置必须连续,后者(子序列LCS)则不必。比如字符串acdfg同akdfc的最长公共子串为df,而他们的最长公共子序列是adf。

LCS解题策略:

one:穷举法。。。复杂度不再多说,想想2的N次方就感到可怕;

two:矩阵,也就是动态规划节LCS问题,也就是今天咱的标题;

下面来细讲the twith idea:

由此图可以看出此经典算法的思路;

下面是代码,方便大家理解:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define MAX(a,b) (a>b?a:b)
 4 const int MAXN=1010;
 5 int dp[MAXN][MAXN];
 6 char a[MAXN],b[MAXN];
 7 int main(){
 8 while(~scanf("%s%s",a+1,b+1)){
 9     memset(dp,0,sizeof(dp));
10     int i,j;
11     for( i=1;a[i];i++){
12         for(j=1;b[j];j++){
13             if(a[i]==b[j])dp[i][j]=dp[i-1][j-1]+1;
14             else dp[i][j]=MAX(dp[i][j-1],dp[i-1][j]);
15         }
16     }
17     printf("%d\n",dp[i-1][j-1]);
18 }
19 return 0;}

此递归关系为:

  1. 若xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列;
  2. 若xm≠yn且zk≠xm ,则Z是Xm-1和Y的最长公共子序列;
  3. 若xm≠yn且zk≠yn ,则Z是X和Yn-1的最长公共子序列。

此算法时间复杂度为n*m,空间复杂度也是n*m;

另外若要记录路径就比较复杂了;

lcs解决lis问题:

需要先排序,然后与原数组求最长公共子序列;

下面是道题poj上的,就用到了此题的思想:

Common Subsequence
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 43194   Accepted: 17514

Description

A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > another sequence Z = < z1, z2, ..., zk > is a subsequence of X if there exists a strictly increasing sequence < i1, i2, ..., ik > of indices of X such that for all j = 1,2,...,k, xij = zj. For example, Z = < a, b, f, c > is a subsequence of X = < a, b, c, f, b, c > with index sequence < 1, 2, 4, 6 >. Given two sequences X and Y the problem is to find the length of the maximum-length common subsequence of X and Y.

Input

The program input is from the std input. Each data set in the input contains two strings representing the given sequences. The sequences are separated by any number of white spaces. The input data are correct.

Output

For each set of data the program prints on the standard output the length of the maximum-length common subsequence from the beginning of a separate line.

Sample Input

abcfbc         abfcab
programming    contest
abcd           mnp

Sample Output

4
2
0

还有南阳oj上面有道最长公共子序列更是LCS的模板;

转载于:https://www.cnblogs.com/handsomecui/p/4717444.html

奇妙的算法之LCS妙解相关推荐

  1. 《妙解Hibernate 3.X》读书笔记一-Hibernate概述及环境搭建

    很早就想开始Hibernate的系统学习,但是一是工作原因,二是苦于找不到合适的书籍.Hibernate更新较快,一些被称为经典的书籍,如<深入浅出Hibernate>.<Hiber ...

  2. SQL Server开发人员应聘常见问题妙解

    SQL Server开发人员应聘常见问题妙解 目前在职场中很难找到非常合格的数据库开发人员.我的一个同事曾经说过:"SQL开发是一门语言,它很容易学,但是很难掌握." 在面试应聘的 ...

  3. python如何调用文件进行换位加密_python 换位密码算法的实例详解

    python 换位密码算法的实例详解 一前言: 换位密码基本原理:先把明文按照固定长度进行分组,然后对每一组的字符进行换位操作,从而实现加密.例如,字符串"Error should neve ...

  4. DL之AlexNet:AlexNet算法的架构详解、损失函数、网络训练和学习之详细攻略

    DL之AlexNet:AlexNet算法的架构详解.损失函数.网络训练和学习之详细攻略 相关文章 Dataset:数据集集合(CV方向数据集)--常见的计算机视觉图像数据集大集合(建议收藏,持续更新) ...

  5. DL之ShuffleNet:ShuffleNet算法的架构详解

    DL之ShuffleNet:ShuffleNet算法的架构详解 相关文章 DL之ShuffleNet:ShuffleNet算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 DL之Shuf ...

  6. DL之MobileNetV2:MobileNetV2算法的架构详解(包括ReLu的意义)

    DL之MobileNet V2:MobileNetV2算法的架构详解 相关文章 DL之MobileNetV2:MobileNetV2算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 DL ...

  7. DL之SqueezeNet:SqueezeNet算法的架构详解

    DL之SqueezeNet:SqueezeNet算法的架构详解 相关文章 DL之SqueezeNet:SqueezeNet算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 DL之Sque ...

  8. ​​​​​​​DL之ResNeXt:ResNeXt算法的架构详解

    DL之ResNeXt:ResNeXt算法的架构详解 相关文章 DL之ResNeXt:ResNeXt算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 DL之ResNeXt:ResNeXt算 ...

  9. 【算法知识】详解堆排序算法

    点击蓝色字关注我们! 什么是堆 「堆」首先是一个完全二叉树,「堆」分为「大顶堆」和「小顶堆」: 「大顶堆」 : 每个节点的值大于或等于其左右孩子节点的值,称为大顶堆. 「小顶堆」同理就是每个节点的值小 ...

最新文章

  1. 神经网络php代码,慢慢研究
  2. WordPress podPress插件‘playerID’参数跨站脚本漏洞
  3. 【开发环境】StarUML 工具 ( 下载软件 | StarUML 安装 | StarUML 创建工程 )
  4. 博客转移至:www.bugsafe.cn
  5. C#访问SQLServer增删改查代码实例
  6. strcpy会覆盖原来的吗_幽默你真的会了吗?原来可以这么简单
  7. php curl 代理ip访问url
  8. Qcon出品全球软件开发者大会北京站-低代码实践与应用
  9. Java命令学习系列(四)——jstat
  10. svn访问方式 linux,ssh+svn 方式访问svn
  11. Mac 安装 Grunt
  12. 【工科数学分析】2021-10-01-工科数学分析叒复习(一)
  13. vscode顶部菜单栏不见了,怎么办?
  14. 作为一枚程序员,每天必用的软件有哪些?
  15. 2000 Followers-3D CSS text
  16. hdu 6441 (费马大定理+勾股数 数学)
  17. Unity Shader - URP ShadowCast ShadowRecieve - 投影 和 接受阴影
  18. 睡眠助手APP开发解决方案
  19. 【深度学习 项目实战】Keras深度学习多变量时间序列预测的LSTM模型
  20. 【转载】MISRA C-2012规则中文版

热门文章

  1. 伍六七带你学算法 入门篇-最长回文串
  2. 2022-2028全球与中国跨临界二氧化碳系统市场现状及未来发展趋势报告
  3. mybatis ResultMap
  4. GPT3 api接口调用
  5. NVIDIA数据中心深度学习产品性能
  6. MindSpore Lite整体架构介绍
  7. TVM设计与构架构建
  8. 使用现场总线更快更远
  9. 可视化反投射:坍塌尺寸的概率恢复:ICCV9论文解读
  10. Android Intent setAction的使用注意