此文转载时必须通知博主,并把原文链接及原作者放在正文醒目位置。
————————动态规划初步————————
一、常见动态规划:
求最优解、次优解;
统计问题。
二、DP模型:
线型- 一条直线、两条直线、多条直线(二维矩阵)。
树型- 明显能够构成一棵树。多叉树转二叉树:孩子兄弟表示法。
图型- 以图为模型。基于连通性的状态压缩DP(哈密顿环)。
集合类型
三、DP概念:
阶段、状态、决策、状态转移。
最优化原理、无后效性原理。
四、步骤
划分阶段—设置状态—状态转移方程—(优化决策)
五、例题分析
————————树形动态规划————————
一、步骤
从根开始-->逐层推进-->叶子节点结束
二、孩子兄弟表示法
在树型动规中,为了把多叉树转化为二叉树,方便分析(相当于把普通的题目转化为类似01背包的DP),采用孩子兄弟表示法。
一个结点,它的左儿子表示它的孩子,右儿子表示它的兄弟。
因此对于每一棵子树,在根结点没有被选择的情况下,其右儿子结点也是可以选择的。
三、特殊题型
加分二叉树:由中序遍历推断二叉树结构,由于中序遍历顺序为左—中—右,因此可假设根节点为k,再进行动态规划。
软件安装:若DP阶段出现依赖性环,则可以将环缩为一个点。
聚会的快乐:f[i][j] 其中i表示当前(根)节点。
多一个需要规划的状态,加一维。
个别状态在不同的情况下没有变化,可降维。
————————状态压缩动规————————
一、常见类型:
铺砖、摆放骑士(马)
二、特点
将一行的状态压缩成一串二进制数,每次确定一行的状态。通常需要处理的题目中任意一行都只对其周围有限行产生影响,按照各行的影响进行DP。
例如“地砖铺设”,任意一行的地砖只会对本行和接下来一行产生影响。
“骑士”,一个骑士只受它上下各两行的骑士影响。
善用#define来避免不必要的错误。
———————基于连通性的状压DP———————
一、其他概念
插头:一个格子某个方向的插头存在,表示这个格子在这个方向与相邻格子相连。
轮廓线:配合插头使用,确定连通块的一条线。
轮廓线确定方法:暂时未知
二、处理问题
图上有障碍的哈密顿回路问题。
———————动态规划优化———————
一、时间复杂度分析
O=阶段数*每个阶段的状态转移数*每次状态转移时间
优化途径:减少状态转移数
二、优化方法
从问题特性入手;
先写出基础DP方程,再进行简化或优化。
1.改变状态的表示,即改变数组F[][]的含义,减少循环变量数。也用于降维。
2.合理组织状态,如何更新状态更高效。
*其他知识:离散数学的偏序集、Dilworth定理
3.预处理出一个(或多个)数组记录某些定值,实现降维。
4.状态选取时加入贪心
5.以套餐问题为例:
A-提前计算最多可生产多少套,剪枝状态。
B-先解决成套生产的部分时间,再进行动态规划,减少状态数。但注意成套生产时间不能过长。
C-淘汰一些没有意义的状态,如某种物质超标。
6.利用数据结构优化
常见数据结构:二叉堆、字典树、并查集
7.利用决策的单调性
队列优化
斜率优化
(以上两个优化需要了解证明,超出NOIP范围)
【听课记录】17-7-11 动态规划 - 朱全民