最近写了一些动态规划……简单总结一下
区间DP
做了好多道感觉都非常套路……就感觉都和合并石子长一个样。无非就是区间从短到长依次更新,然后还有一些奇奇怪怪的转移方法(这个就因题而异了)。区间DP唯一考点可能就是这些奇奇怪怪的判断了……
树形DP
树这种东西,一般都是从子树的状态然后转移到父亲(然而并不全是)。一般看到树形DP先想能不能从子树转移,如果不能再考虑其他奇奇怪怪(?)的方法。
做树形DP的时候做到了一个叫基环树的东西,这玩意儿满足一个性质,他带环。……
环上的边任意删去一条然后就成了一棵正经树。
为了考虑周全,一般都对边两端的点分别做根各DP一次,防止两个点的状态相互影响。
http://blog.sina.com.cn/s/blog_140e100580102w8x9.html
这篇blog到时候再找时间填了吧……现在就先不填了
状压DP
这类题做的并没有几道,因为学长告诉我状压最重要的是思想。(其实是我只会写板子题……)
状压就是对于状态量少的来说,可以用0,1将所有状态表示出来然后进行转移。
一定要用好位运算!(不然状压DP就废掉了)
网格DP
比较灵活……我也没写过几道。
数位DP
一般用于统计[l,r]内符合条件的数的个数。所有我们可以用ans(r)-ans(l-1)来求得个数。
其实我觉得数位DP就是一个NB点的枚举
不过其灵活的地方在于枚举到某一位的时候如果后面要枚举的东西你已经枚举过了,那你就可以直接运用之前的答案(记忆化)或者O(1)计算(比如排列组合什么的)直接求得后面的答案。感觉还是蛮暴力的……
斜率优化DP
总感觉我理解的斜率优化DP和别人的理解不太一样……?
算了不管了
如果一个式子可以化成类似f[i]=kx+b的形式,那么对于当前i,我们可以将i代入这个前面的每一个状态j的斜线,以此求得f[i]。
一般若某一项是i相关和j相关的,i相关为X,j为K。其余i相关为无关变量,j相关为B
我们根据斜率的上升(下降)来维护凸包。用单调队列维护即可。具体内容我也不是很能讲懂,结合zyf2000学姐的blog看例题可能就非常好懂了。
矩阵优化DP
之前自己写过矩阵相关的笔记……但仅限于一点皮毛。
觉得俞华程《矩阵乘法在信息学中的应用》的题目还是比较经典的。