奇妙的算法之LCS妙解
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;}
此递归关系为:
- 若xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列;
- 若xm≠yn且zk≠xm ,则Z是Xm-1和Y的最长公共子序列;
- 若xm≠yn且zk≠yn ,则Z是X和Yn-1的最长公共子序列。
此算法时间复杂度为n*m,空间复杂度也是n*m;
另外若要记录路径就比较复杂了;
lcs解决lis问题:
需要先排序,然后与原数组求最长公共子序列;
下面是道题poj上的,就用到了此题的思想:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 43194 | Accepted: 17514 |
Description
Input
Output
Sample Input
abcfbc abfcab programming contest abcd mnp
Sample Output
4 2 0
还有南阳oj上面有道最长公共子序列更是LCS的模板;
转载于:https://www.cnblogs.com/handsomecui/p/4717444.html
奇妙的算法之LCS妙解相关推荐
- 《妙解Hibernate 3.X》读书笔记一-Hibernate概述及环境搭建
很早就想开始Hibernate的系统学习,但是一是工作原因,二是苦于找不到合适的书籍.Hibernate更新较快,一些被称为经典的书籍,如<深入浅出Hibernate>.<Hiber ...
- SQL Server开发人员应聘常见问题妙解
SQL Server开发人员应聘常见问题妙解 目前在职场中很难找到非常合格的数据库开发人员.我的一个同事曾经说过:"SQL开发是一门语言,它很容易学,但是很难掌握." 在面试应聘的 ...
- python如何调用文件进行换位加密_python 换位密码算法的实例详解
python 换位密码算法的实例详解 一前言: 换位密码基本原理:先把明文按照固定长度进行分组,然后对每一组的字符进行换位操作,从而实现加密.例如,字符串"Error should neve ...
- DL之AlexNet:AlexNet算法的架构详解、损失函数、网络训练和学习之详细攻略
DL之AlexNet:AlexNet算法的架构详解.损失函数.网络训练和学习之详细攻略 相关文章 Dataset:数据集集合(CV方向数据集)--常见的计算机视觉图像数据集大集合(建议收藏,持续更新) ...
- DL之ShuffleNet:ShuffleNet算法的架构详解
DL之ShuffleNet:ShuffleNet算法的架构详解 相关文章 DL之ShuffleNet:ShuffleNet算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 DL之Shuf ...
- DL之MobileNetV2:MobileNetV2算法的架构详解(包括ReLu的意义)
DL之MobileNet V2:MobileNetV2算法的架构详解 相关文章 DL之MobileNetV2:MobileNetV2算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 DL ...
- DL之SqueezeNet:SqueezeNet算法的架构详解
DL之SqueezeNet:SqueezeNet算法的架构详解 相关文章 DL之SqueezeNet:SqueezeNet算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 DL之Sque ...
- DL之ResNeXt:ResNeXt算法的架构详解
DL之ResNeXt:ResNeXt算法的架构详解 相关文章 DL之ResNeXt:ResNeXt算法的简介(论文介绍).架构详解.案例应用等配图集合之详细攻略 DL之ResNeXt:ResNeXt算 ...
- 【算法知识】详解堆排序算法
点击蓝色字关注我们! 什么是堆 「堆」首先是一个完全二叉树,「堆」分为「大顶堆」和「小顶堆」: 「大顶堆」 : 每个节点的值大于或等于其左右孩子节点的值,称为大顶堆. 「小顶堆」同理就是每个节点的值小 ...
最新文章
- 神经网络php代码,慢慢研究
- WordPress podPress插件‘playerID’参数跨站脚本漏洞
- 【开发环境】StarUML 工具 ( 下载软件 | StarUML 安装 | StarUML 创建工程 )
- 博客转移至:www.bugsafe.cn
- C#访问SQLServer增删改查代码实例
- strcpy会覆盖原来的吗_幽默你真的会了吗?原来可以这么简单
- php curl 代理ip访问url
- Qcon出品全球软件开发者大会北京站-低代码实践与应用
- Java命令学习系列(四)——jstat
- svn访问方式 linux,ssh+svn 方式访问svn
- Mac 安装 Grunt
- 【工科数学分析】2021-10-01-工科数学分析叒复习(一)
- vscode顶部菜单栏不见了,怎么办?
- 作为一枚程序员,每天必用的软件有哪些?
- 2000 Followers-3D CSS text
- hdu 6441 (费马大定理+勾股数 数学)
- Unity Shader - URP ShadowCast ShadowRecieve - 投影 和 接受阴影
- 睡眠助手APP开发解决方案
- 【深度学习 项目实战】Keras深度学习多变量时间序列预测的LSTM模型
- 【转载】MISRA C-2012规则中文版