博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态规划算法-LCS
阅读量:7020 次
发布时间:2019-06-28

本文共 1075 字,大约阅读时间需要 3 分钟。

  hot3.png

本讲我们来探讨动态规划算法中一个常见的问题最长公共子序列即LCS(Long Common Sequence)。

首先我们来看一下问题描述:

有两个序列X和Y,其中

X = {x1, x2, ..., xm}

Y = {y1, y2, ..., yn}

求X和Y的最长公共子序列长度。

 

例如:X={1, 3, 5, 9, 10}  Y={1, 4, 9, 10},则X和Y的最长公共子序列的长度为3,其中一个序列为{1,9,10}。

 

解题思路:

 

步骤1:用函数的形式来表示结果。

设f(x,y) = z,该函数表示X序列的长度为x, Y序列的长度为y,则XY序列的最长公共子序列长度为z。

所以题目要求解的便是f(m,n)的值。

 

步骤2:分析递推情况。

接下来我们来分析一般情况即f(i,j)的求解。

f(i,j)表示有两个序列

X = x1, x2, ..., xi

Y = y1, y2, ..., yj

如何求这两个子序列的最长公共子序列的长度。

 

所谓的递推关系分析其实就是分析f(i)与f(i-1)、f(i-2)...或f(0)等之间的关系,由于本题是二元函数关系,故就是分析f(i,j)与f(i-1,j-1)、f(i-1,j)、 f(i, j-1)等之间的关系。

 

首先我们来看一下f(i,j)与f(i-1, j-1)之间的关系。

f(i,j)表示的是规模分别为i和j的两个序列的最长公共子序列的长度,而f(i-1, j-1)表示的是规模分别为i-1和j-1的两个子序列的最长公共子序列的长度。

这两者之间有什么联系呢?

 

假设我们现在已经知道f(i-1, j-1)的最长公共子序列的长度,现在要求f(i,j)函数的值,你该如何求解?

 

当两个序列的最后一个元素相等时,此时f(i,j)的值应该就是f(i-1, j-1) 的值加上1,即

f(i,j) = f(i-1, j-1) + 1, 这种情况比较好理解。

 

当两个序列的最后一个元素不等时,则我们需要考虑f(i-1, j)和f(i, j-1)的最大值,即max{f(i-1, j), f(i, j-1)}。

 

综上,我们可以得出下面的递推关系式:

 

 

步骤3:算法实现

算法实现我们将开辟新的文章来讲解,敬请期待。

 

总结:

无论什么样的动态规划题目我们基本都可以按照上面的思路来求解,步骤一其实就是问题的分解,寻找合适的自变量来控制问题的规模,步骤二的递推关系分析也有一定的规律可循,后面将开辟新的文章来分析。

转载于:https://my.oschina.net/gschen/blog/846158

你可能感兴趣的文章
JQuery选择器
查看>>
nmcli 使用记录---fatt
查看>>
【技巧】EasyUI分页组件pagination显示项控制
查看>>
POJ 3989 A hard Aoshu Problem
查看>>
ubuntu系统的谷歌浏览器的安装
查看>>
在JavaScript中"+"什么时候是链接符号,什么时候是加法运算?
查看>>
POJ1179 Polygon
查看>>
矩阵覆盖,基本DP题目
查看>>
定义一个不能被继承的类
查看>>
xgboost参数调优的几个地方
查看>>
python3编写网络爬虫13-Ajax数据爬取
查看>>
JVM监控启动参数
查看>>
npm 是干什么的
查看>>
视达配色教程1 色彩是什么
查看>>
枚举2--熄灯问题
查看>>
overload和override二者之间的区别
查看>>
Spring MVC工作原理(好用版)
查看>>
html5--1.18 div元素与布局
查看>>
HTML.7表单
查看>>
企业架构研究总结(7)——联邦企业架构之FEAF的出现和构成(下)
查看>>