最长公共子序列(LCS)问题——动态规划法

问题描述

给定序列 𝑋 = 𝑥 1 , 𝑥 2 , … , 𝑥 𝑚 𝑋 = {𝑥_1, 𝑥_2, … , 𝑥_𝑚} X=x1,x2,,xm ,序列 𝑍 = 𝑧 1 , 𝑧 2 , … , 𝑧 𝑘 𝑍 = {𝑧_1, 𝑧_2, … , 𝑧_𝑘} Z=z1,z2,,zk是𝑋的子序列,是指:存在一个严格递增下标序列 𝑖 1 , 𝑖 2 , … , 𝑖 𝑘 {𝑖_1, 𝑖_2, … , 𝑖_𝑘} i1,i2,,ik,使得对于所有 j = 1 , 2 , … , k j=1,2,…,k j=1,2,,k 𝑧 𝑗 = 𝑥 i j 𝑧_𝑗 = 𝑥_{i_j} zj=xij

给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的
公共子序列

给定2个序列 𝑋 = 𝑥 1 , 𝑥 2 , … , 𝑥 𝑚 𝑋 = {𝑥_1, 𝑥_2, … , 𝑥_𝑚} X=x1,x2,,xm 𝑌 = 𝑦 1 , 𝑦 2 , … , 𝑦 𝑛 𝑌 = {𝑦_1, 𝑦_2, … , 𝑦_𝑛} Y=y1,y2,,yn,找出𝑋和𝑌的最大长度公共子序列。

动态规划法

划分子问题: 找出最优解的性质,并刻划其结构特征;

设序列 X = ( x 1 , x 2 , … , x m ) X = (x_1, x_2, \ldots, x_m) X=(x1,x2,,xm) Y = ( y 1 , y 2 , … , y n ) Y = (y_1, y_2, \ldots, y_n) Y=(y1,y2,,yn) Z = ( z 1 , z 2 , … , z k ) Z = (z_1, z_2, \ldots, z_k) Z=(z1,z2,,zk)是 X 和 Y 的任意一个 LCS,则:

(1) 若 x m = y n x_m = y_n xm=yn,则 (z_k = x_m = y_n) 且 z k − 1 z_{k-1} zk1 X m − 1 X_{m-1} Xm1 Y n − 1 Y_{n-1} Yn1 的一个 LCS;

(2) 若 x m ≠ y n x_m \neq y_n xm=yn z k ≠ x m z_k \neq x_m zk=xm,则 Z 是 X m − 1 X_{m-1} Xm1 和 Y 的一个 LCS;

(3) 若 x m ≠ y n x_m \neq y_n xm=yn z k ≠ y n z_k \neq y_n zk=yn,则 Z 是 X 和 Y n − 1 Y_{n-1} Yn1 的一个 LCS。

最长公共子序列问题具有最优子结构性质。

递归式推导:递归地定义最优解的值,找出最优解的递归式;

请添加图片描述

计算最优值:按自底向上的方式计算最优解的值。

请添加图片描述

构造最优解:由计算出的结果构造一个最优解。

数据结构设计:

  • c[m][n] 存放最优解值,计算时行优先
  • b[m][n] 为解矩阵,存放构造最优解信息请添加图片描述
    当构造解时,从𝑏[𝑚, 𝑛]出发,上溯至𝑖 = 0或者𝑗 = 0止。
    上溯过程中,当𝑏[𝑖,𝑗]包含“ ↖ ”时打印出 𝑥 𝑖 ( 𝑦 𝑗 ) 𝑥_𝑖(𝑦_𝑗) xi(yj)

请添加图片描述
说明:

  1. 每当在表项𝑏[𝑖,𝑗]中遇到一个“ ↖ ”时,即意味着 𝑥 𝑖 = 𝑦 𝑗 𝑥_𝑖 = 𝑦_𝑗 xi=yj是LCS的一个元素;
  2. 时间复杂度:𝜃(𝑚 + 𝑛)

例子

若X = <A, B, C, B, D, A, B> ,Y=<B, D, C, A, B, A>,则

请添加图片描述
最优解为BCAB 或 BCBA

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值