DP学习总结

Posted 卿吟酒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DP学习总结相关的知识,希望对你有一定的参考价值。

数位dp

提问方式

在区间 [ l , r ] [l,r] [l,r] 内满足某种性质的数的个数

将状态设置为 f [ n ] f[n] f[n] 意思是 “从1到n满足该性质的数的个数”,然后用 f [ r ] − f [ l − 1 ] f[r]-f[l-1] f[r]f[l1]得到答案。


考虑问题

用树的方式去考虑问题

每一次分成两个分支:当前位取给定数这一位上的值,或是当前位取小于给定数。

前一种情况会将信息记录后,继续循环求解,后一种情况多用组合数或是已经预处理出的部分状态来求解,累加入答案。


dp的具体体现

预处理过程

数位dp的难点一般在于预处理 f f f 数组过程 ,一般 f f f 数组的状态为 f [ i ] [ j ] [ . . . ] f[i][j][...] f[i][j][...] “一共有 i i i 位的数,最高位是 j j j (由题意约束的其他性质 p p p下) 符合题目要求的数的个数”。

然后再用预处理出的数组,将 R , L − 1 R,L-1 R,L1 分别求解即可。


斜率优化dp

适用场合

转移方程在整理后,得到的新方程是一次函数形式,而x,y对应的是已求出的数的 j j j 的某两个属性,方程斜率可以直接得到, 想要得到的新状态 f [ i ] f[i] f[i] 是截距的组成部分之一。


核心思想

最优解 是在固定斜率的情况下,能取到最小(或最大)截距的点,所以可以将在各种斜率下,都不可能被用到的点删掉,删完后发现,剩下的点构成凸包,只有凸包上的点,才会被用于求出 f [ i ] f[i] f[i]


分类

斜率呈单调性变化

(以下两种情况的维护条件,都是新插入的点的横坐标单调递增)

- 斜率单调递增(且为正)

这类问题的前置条件一般是求最小值

无法被一条斜率大于0的直线第一个扫描到的点都是无用的点,将这些点删去后我们可以得到一个凸包。

那么我们得到所示图,发现该图的斜率单调递增。
在这里插入图片描述
因为我们的斜率为正,且单调递增,所以可以维护一个存点的队列,两个点所组成的斜率若小于当前所求的斜率,则对于下一个状态所对应的斜率,也一定小于下一个斜率。

在这里插入图片描述
如图

对于当前状态的斜率(黄色线)我们所维护的凸包中,第一个与后一个点所构成的线段满足斜率大于黄色线的点,就是我们要找的点,在必须要经过一个红色点的情况下,该点可使黄色线在 y y y 轴上的截距最小。

因此 我们维护一个斜率单调递增的凸包,在每次查询前,将队头所有斜率小于当前查询斜率的点删去。

而在加入新点时,若 p r 和 p i p_r和p_i prpi 所构成的直线的斜率小于 p r − 1 和 p r p_{r-1}和p_r pr1pr 所构成的斜率,那么则应该将 p r p_r pr 这个点删去,才能满足凸包内的点所形成的斜率具有单调性。

- 斜率单调递减(且为负)

大致与斜率为正的情况相同。

但是,此时所求解的问题一般是:求xxx的最大值

区别是图形变为了

在这里插入图片描述

因此我们需要维护一个斜率单调递减的队列。

斜率第一个小于当前状态的斜率的点,就是可以更新状态的最优点,这个点可以使y轴上的截距最大。

在这里插入图片描述
如图所示 , k 1 k1 k1小于黄色线条的斜率,橙色箭头所指的点即为最优点。

因为我们每个状态的斜率单调递减,所以在查询前,可以删去队头大于当前斜率的点。

而在加入新点时,若加入的新点和队尾点所形成的直线的斜率大于原先队尾两点之间的斜率,则删去队尾点。

在这里插入图片描述
删去的即为橙色箭头所指的点。


- 斜率不呈单调性变化

维护的时候,不能再删去队头的点。

队尾的点维护方式不变。

查询时,由 O ( 1 ) O(1) O(1)(直接取队头点)变为 O ( l o g N ) O(logN) O(logN) (二分查找)


以上的分类还都满足:新加入的点的横坐标单调递增

若不满足,则需要用平衡树来维护

(还没学 这个坑以后再填吧)


以上是关于DP学习总结的主要内容,如果未能解决你的问题,请参考以下文章

DP学习总结

背包dp总结

强化学习阶段总结

外出学习总结

Shell脚本语言学习总结

总结leetcode剑指offer分类学习速成