动态规划部分总结
也许很多人会问,DP是什么?
在我看来,DP就是一个解决多阶段决策过程问题的方法
也就是,在决策之间没有影响时,如何获得一个全局最优解(最优子结构)
这也是把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解
这就将全局最优解化为了单次最优解
貌似这就是阶段版贪心?
OKOK,大概就是这样了
我才不会告诉你当初差点被DP劝退呢
1 线性DP
线性DP也就是最基础的DP,我们利用状态间的线性关系去寻找最优解
这个的状态比较容易转移,比较好想
题目:
导弹拦截
2 区间DP
所谓区间DP,顾名思义就是在一段区间上的动态规划。还应该符合在区间上操作的特点。我的理解是往往会对区间进行合并操作。抑或是单个元素(可看成一个小区间)跨区间进行操作。
要得知一个大区间的情况,由于它必定是由从多个长度不一的小区间转移而来(转移情况未知),我们可以通过求得多个小区间的情况,从而合并信息,得到大区间。
显然,区间DP一般都是
O(n3)
O
(
n
3
)
(枚举长度,枚举左节点,枚举切割点)
不过有一些区间DP可以优化成
O(n2)
O
(
n
2
)
,要用一个叫做“四边形不等式”的东西进行优化,后面会讲
区间DP的状态也很容易转移,比较好想
题目:
能量项链
[SDOI2008]石子合并
3 树型DP
顾名思义,树型动态规划就是在“树”的数据结构上的动态规划,平时的动态规划都是线性的或者是建立在图上的,线性的动态规划有二种方向既向前和向后,相应的线性的动态规划有二种方法既顺推与逆推,而树型动态规划是建立在树上的,所以也相应的有二个方向:根->叶子 or 叶子->根
因为树是一个满足最优子结构的数据结构,也本身就具有递归性 ,如此优美当然要用来DP啊,所以说树型DP的转移方程一般较为直观
但是,树型DP的状态划分极其难想,细节多(什么父亲,儿子,兄弟什么的…)
而且,状态转移方程是直观,但是要想出转移方程还是很难的
4 数位DP*
5 状压DP
状压DP是通过用01串来枚举状态并且进行转移,一般的,我们用0表示不选,1表示选,这样一共有
O(2n)
O
(
2
n
)
种状态
由于状压DP状态数较多,所以一般用于
n
n
<script type="math/tex" id="MathJax-Element-15">n</script>较小的情况,应该还是比较容易看出来的(雾~
题目:
想到了再更…
6 概率与期望DP
一般来说,概率与期望DP中没有只有转移,没有规划,因为每个事件都是由概率组成的,那么最终解就是由所有事件组成的概率集
emm,这里的题目一般都很恶心,每个点都会有多种状态转移叠加而来,要是实在做不出了,找规律一般也是可行的哦
[NOIP2016]换教室
[HNOI2015]亚瑟王
7 优化
DP的转移一般都要遍历之前有过的所有状态,有时候因为状态太多而导致超时,但是在这些状态中有些状态其实是根本不可能被选中的,所以我们就可以利用各种各样的优化去将这些状态去除掉,这就是DP优化的真谛!
7.1 斜率优化
强烈安利博客
自己写的,感觉很通俗易懂
题目:
[HNOI2008]玩具装箱toy
[APIO2010]特别行动队
[APIO2014]序列分割