学习课程:算法与数据结构高手养成-求职提升特训课
章节名称:第6章 动态规划进阶 Advanced Dynamic Programming
讲师:吉他熊
课程内容:
线性模型
具有线性“阶段”划分的动态规划算法统称为线性DP
一个动态规划算法的“状态”包含多个维度,但在每个维度都具有“线性”变化的“阶段”,也是线性DP
区间模型
线性DP一般从初态开始,沿着阶段的扩张向某个方向推进,直至计算出目标状态。
区间DP也属于线性DP中的一种,它以“区间长度”作为DP的“阶段”,使用两个坐标(区间的左、右端点)描述每个维度。
在区间DP中,一个状态由若干个比它更小且包含于它的区间所代表的状态转移而来,故区间DP的决策往往就是划分区间的方法。区间DP的初态一般由长度为1的“元区间”构成。
这种向下划分、向上递推的模式与某些树形结构(线段树)类似。
树形模型
在树上设计动态规划算法时,一般以节点从深到浅(子树丛小到大)的顺序为DP的“阶段”。DP的状态表示中,第一维通常是节点编号(代表以该节点为根的子树)。
大多数时候,采用递归的方式实现树形动态规划,对于每个节点x,先递归它的每个子节点并进行DP,回溯时,从子节点向节点x进行状态转移。
与深搜和广搜一样,除了自顶向下递归外,也可以使用自底部向上拓扑排序来执行树形DP,另外也可使用栈来实现非递归写法(后序遍历)。这三个方法,递归相对较好写。
状态压缩
动态规划的过程是随着“阶段”的增长,在每个状态维度上不断扩展。在任意时刻,已经求出最优解的状态与尚未求出最优解的状态在各维度上的分界点组成了DP扩展的“轮廓”。
对于某些问题,我们需要在动态规划的“状态”中记录一个集合,保存这个“轮廓”的详细信息,以便进行状态转移。若集合大小不超过N,集合中每个元素都是小于K的自然数,则我们可以把这个集合看作一个N位K进制数,以一个[0,K**N-1]之间的十进制整数形式作为DP状态的一维。
把集合转化为整数记录在DP状态中的一类算法,被称为状态压缩动态规划算法。
学习收获:
学习了高级DP模型及状态压缩思想,但是对于如何选择和运用模型还需要多多强化训练
打卡截图: