当前课程知识点:数据结构(上) > 第一章 绪论(下) > (xc)动态规划 > 01XC-8: LCS:理解
如果沿用刚才那种表示方式
我们就可以把在
这个算法过程中
所能够生成的
所有的递归实例
汇合整理成这么一张表格
这张表格的横向和纵向
分别对应着
定义问题的两个序列
而每一个横纵坐标
所确定的由3×3 9个小方格
对应的一个大方格
分别对应于一个子任务
或者是一个递归实例
我们可以看到
如果是减而治之的情况
就直接绘制成一条对角线
比如说 这个地方的A
和这个地方的A 是相等的
刚才说过 这是减而治之
所以我们会直接去把
这两个A都抹除掉
递归地求解
它左上方的那个问题
对应的就是ADV和EDUC
所对应的那个子问题
如果递归地求解
能得到是1
那么我们只要
在它的基础上缀上A
从长度上来讲 再加1
就可以得到原问题的解
那么对于分而治之的情况呢?
我们会同时考虑它的上方
那个子问题和
左侧那个子问题
对于这个问题而言
这是T 和这边的I
是不相等的
所以这个问题
应该属于分而治之的情况
这时候我们要考虑
左侧去掉了I
对应的那个问题
我们说它的解
递归地可以求到 是3
以及上方去掉了
这边的T所对应的那个问题
那么它的解
递归地可以求到 是2
而这个原问题的解是多少呢?
那么就应该是在
这两个子问题的解
也就是3和2之间
取更长者 也就是3
所以这里我们把通往更长者
那子问题的那条递归的边
保留下来
而更短的那条边 给它去掉
当然也有可能
有的时候是歧义的
比如说 在这个时候
这个3 既可以理解成
是从这儿 延续下来的
也可以理解成是从这儿
延续下来的
无论如何 我们都可以表示成
这样的一个形式
这样的形式有什么好处呢?
我们说这个形式
可以帮助我们理解
整个计算的过程
具体来说 我们可以看到
在这样的一张表中
我们最终求解的问题
实际上 必然是右下角这个单元
所对应的子问题
而它呢 分别会递归地引发
一些更小的子问题
直到最终收缩到平凡的
长度为0的问题
我们也可以认为
每一个LCS 最终的解
其实都对应于 从最左上角
这个0 0 这个位置
一直沿着刚才的
这种可行的深色的路线
通往最右下角
这个单元的一条路径
每一条这样的路径
对应于这样一个解
反之 每一个这样的解
也必然对应着一条路径
所以在这里头
我们很好地可以来解释
所谓的多个解的情况
也就是说 同时可能存在多条路
我们来看 从这个地方
第一个字符D 是必须要去的
第二个字符A 也是必须要去的
但是第三个字符
我们可以走T 也可以走N
然后 第四个字符
我们又重新走下一个A
所以 这也是为什么
这个问题具有两个解
一个是data
一个是dana
当然我们也鼓励同学 在课后
针对讲义 考察这个例子
同样 解释为什么
不仅有多个解
而且它同时存在这样的歧义
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)计算
--演示
--(a)计算--作业
-(b)计算模型
-(b)计算模型--作业
-(c)大O记号
-(c)大O记号--作业
-(d)算法分析
-(d)算法分析--作业
-(e)迭代与递归
-(e)迭代与递归--作业
-(xc)动态规划
-- 演示
-(xc)动态规划--作业
-本章测验--作业
-(a)接口与实现
--02A-5 复制
-(a)接口与实现--作业
-(b)可扩充向量
-(b)可扩充向量--作业
-(c)无序向量
--02C-1 概述
--02C-3 插入
--02C-6 查找
--02C-8 遍历
-(c)无序向量--作业
-(d1)有序向量:唯一化
-(d1)有序向量:唯一化--作业
-(d2)有序向量:二分查找
-(d2)有序向量:二分查找--作业
-(d3)有序向量:Fibonacci查找
-(d3)有序向量:Fibonacci查找--作业
-(d4)有序向量:二分查找(改进)
-(d4)有序向量:二分查找(改进)--作业
-(d5)有序向量:插值查找
-第二章 向量(下)--(d5)有序向量:插值查找
-(e)起泡排序
--02E-2 改进
--02E-3 反例
-(e)起泡排序--作业
-(f)归并排序
-(f)归并排序--作业
-本章测验--作业
-(a)接口与实现
--03A-4 实现
-(a)接口与实现--作业
-(b)无序列表
--03B-2 查找
-(b)无序列表--作业
-(c)有序列表
--03C-3 查找
-(c)有序列表--作业
-(d)选择排序
--03D-1 构思
--03D-2 实例
--03D-3 实现
--03D-4 推敲
--03D-6 性能
-(d)选择排序--作业
-(e)插入排序
--03E-1 经验
--03E-2 构思
--03E-3 对比
--03E-4 实例
--03E-5 实现
-(e)插入排序--作业
-(xd)习题辅导:LightHouse
-本章测验--作业
- (a)栈接口与实现
--04A-1 栈
--04A-2 实例
--04A-3 实现
- (a)栈接口与实现--作业
-(c1)栈应用:进制转换
-第四章 栈与队列--(c1)栈应用:进制转换
-(c2)栈应用:括号匹配
-(c2)栈应用:括号匹配--作业
-(c3)栈应用:栈混洗
-第四章 栈与队列--(c3)栈应用:栈混洗
-(c4)栈应用:中缀表达式求值
-(c4)栈应用:中缀表达式求值--作业
-(c5)栈应用:逆波兰表达式
-第四章 栈与队列--(c5)栈应用:逆波兰表达式
-(d)队列接口与实现
--04D-1 接口
--04D-2 实例
--04D-3 实现
-第四章 栈与队列--本章测验
-(a)树
--05A-1 动机
--05A-2 应用
-(a)树--作业
-(b)树的表示
--05B-2 父亲
--05B-3 孩子
-第五章 二叉树--(b)树的表示
-(c)二叉树
-(c)二叉树--作业
-(d)二叉树实现
-(d)二叉树实现--作业
-(e1)先序遍历
-(e1)先序遍历--作业
-(e2)中序遍历
-第五章 二叉树--(e2)中序遍历
-(e4)层次遍历
-第五章 二叉树--(e4)层次遍历
-(e5)重构
-(e5)重构--作业
-本章测验--作业
-(a)概述
-(a)概述--作业
-(b1)邻接矩阵
-(b1)邻接矩阵--作业
-(c)广度优先搜索
--06C-2 策略
--06C-3 实现
--06C-5 实例
-(c)广度优先搜索--作业
-(d)深度优先搜索
--06D-1 算法
--06D-2 框架
--06D-3 细节
-(d)深度优先搜索--作业
-第六章 图--本章测验