动态规划总结

华电北风吹
天津大学认知计算与应用重点实验室
日期:2015/12/7

近期学了几个动态规划正好总结一下。里面不涉及具体问题的具体解法,有问题可以参看我的具体类型的讲解博客。

目前所见动态规划可以划分为两类:链式和树形。而且这两类中的每个节点都是一个完整的状态集合。

一、链式动态规划
链式动态规划的题目类型还是比较多的,例如斐波那契数列求解,最大钢管价值切割,完美覆盖问题,状态压缩动态规划,0/1背包问题,最长公共子序列。其中的完美覆盖问题和最长公共子序列问题又可以称作矩阵类问题,但是求解方法满足链式动态规划的的一般思想。
1、斐波纳契数列的求解和最大钢管价值切割
这两个可以归为一类问题,也有很多问题可以归为这一类。这属于最简单的动态规划问题。说简单是因为每个节点的状态用一个数就可以表示。其中,斐波那契数列求解的链表长度是项序数n,就是从1到n,每个数字都是链表的一个节点,最大钢管价值切割定义以钢管长度为链表的链式结构。
2、完美覆盖问题
以行(列)的所有可能形式定义每个节点的状态,以列(行)为链,建立链式动态规划。
3、状态压缩动态规划
这种类型的问题的特点是行数任意,列数不能太多,因此可以以列建立链式结构,行的所有状态建立状态集合,然后根据具体问题的具体要求建立状态转移函数。
4、0/1背包问题
以所有可能的价值为每个节点的状态,以物品为链建立链式动态规划。
5、最长公共子序列
分别以两个序列的元素顺序建立二维数组,二维数组里面的每个元素记录当前节点的最长公共子序列的长度和最后一个元素的值。以行为状态,列为链表,依次更新每个节点的状态(也可以行列旋转)。

二、树形动态规划
树形动态规划是链式动态规划的扩展。从根节点至叶子节点的每条路径在形式结构上与链式动态规划类似,树形动态规划区别于链式动态规划的是他的状态转移依赖于他的所有叶子节点(链式可以看作只有一个子节点的树形)

三、动态规划解题技巧
1、动态规划基本思路是空间换时间。
适合于动态规划求解的问题必满足两个形式:最优子结构和子问题重叠。子问题重叠使得我们可以保存子问题的解,防止多次计算,最优子结构使得保存的子问题的解是有效的,可以积小为大。
2、解决动态规划类问题关键点是每个节点状态的定义和状态转移函数的确定。
在理解了本文前面总结的以后节点状态的定义肯定不是问题,那么就要确定节点之间的状态转移,这里我的建议是手工算几个例子,算了以后能够更加快速和深入的理解状态转移过程。
3、状态转移的因果性和后效性。
目前大部分的状态转移都是子问题的最优结构影响包含该子问题的问题的求解,可以称此为因果性。这方面的例子有斐波那契数列求解,最大钢管价值切割,完美覆盖问题,状态压缩动态规划,0/1背包问题,最长公共子序列。
也有后效性的动态规划,当前状态影响的是在此节点后面节点的状态,可以称此为后效性。这方面的例子有跳跃游戏
状态转移的时候可能要结合很多其他的知识,比如广度优先搜索,位运算等等技巧。
4、链式求解顺序
大部分的题目都是对链表上节点的状态按从前往后的顺序更新每个节点的所有状态,例如本文所涉及的所有动态规划问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值