算法导论.动态规划.最长公共子序列

0.问题描述

0.1example

eg.X=(A, B, C, B, D, B)
W=(B, D, A)不是X的子序列,因为X中D之后没有A元素
Z=(B, C, D, B)是X的子序列,因为X中按顺序存在Z中元素
即使Z在元素在X里不连续也可以!!!只要顺序对上了就行

0.2公共子序列

Z是序列X与Y的公共子序列如果Z是X的子序列也是Y的子序列。

0.3LCS

最长公共子序列

0.4 第i前缀
设X=(x1, x2, …, xn)是一个序列
则Xi=(x1, …, xi)是X的第i前缀

0.5 C( , )
在这里插入图片描述

1.算法思想

1.1 核心思想:从X和Y数组的最后的元素开始处理问题,如果xm = yn则把xm和yn从X,Y中去掉,处理前面的元素。若不相等则有两种处理方式
在这里插入图片描述
在上式的基础上可得到
c[i,j]在i = 0 || j = 0时为0!!!
在这里插入图片描述
所以下图中的C(i,j)可能:
1.来自左上方元素
2.来自上方元素
3.来自左方元素
在这里插入图片描述

所以可以递归的求解问题
下图中先求出来第一行和第一列,其他元素便可解。其他元素可以按行求解也可以按列求解
在这里插入图片描述

2.算法实例

第一行对应的i为0
第一列对应的j为0
c[i,j]在i = 0 || j = 0时为0!!!
在这里插入图片描述
在上图的基础上再加上三种箭头表示数值的来源
在这里插入图片描述

3.伪代码

在这里插入图片描述

4.复杂性分析

时间复杂性

计算代价的时间
(i, j)两层循环
O(mn)
构造最优解的时间: O(m+n)
总时间复杂性为:O(mn)

空间复杂性

使用数组C和B
需要空间O(mn)

猜你喜欢

转载自blog.csdn.net/qq_41359808/article/details/88679519