矩乘大家都会!
线段树大家都会!
所以动态 DP 就这样诞生了!
一些线性能做的 DP 可以写成广义矩阵乘法的形式,只要这个广义矩阵乘法具有结合律,那么就可以进行区间查询一类的操作,也可以进行单点修改,只需要架到线段树上即可。
于是序列上的动态 DP 就出现了!
树上问题
各种序列上问题都可以架到树上。
如果是树的话,就没有那么简单了。
于是我们使出树上问题常用的好东西:树链剖分!
一条重链上维护所有的转移矩阵,而轻儿子的贡献直接暴力合并到上面的重链上。
具体来讲就是 \(f_{i,0/1}\) 表示第 \(i\) 个点,选/不选 \(i\) 且不考虑重儿子的答案,\(g_{i,0/1}\) 就是考虑重儿子的答案。我们可以一次求出整个 \(f,g\),如果有查询整棵树的,就是对应根的重链,查询子树的就是对应的位置的向下的重链的答案。
所以怎么构造矩阵呢。
我们需要构造一个包涵轻儿子信息的东西,这样和重儿子乘一起之后就会得到自己的答案。
具体怎么构造看方程吧,(其实是我懒得写了)。
然后就是修改了。修改会影响当前点所在的重链和它所在的所有轻链之上的父亲的转移矩阵,所以我们架到线段树上,直接修改对应点的转移矩阵,然后跳重链,跳到一个就修改那里的转移矩阵。
就这样,没有了。
没见过几个题。
【模板】"动态 DP"&动态树分治
就是上面说的板子
没了。
[NOIP2018] 保卫王国
还是上面说的板子,因为全集-最大独立集=最小覆盖。
强制选就是点权设的很大,强制不选就是点权设的很小。
但是由于这题没有修改点权的操作,所以存在更智慧的做法。
就是预处理出每个点向上 \(2^j\) 个点之内与所有点的子树(不包括 \(i\) 的子树)的 DP 值,\(i\) 和它祖先选不选都处理出来,然后再算一个整棵树除了 \(i\) 的子树的贡献,这样就能处理出询问的内容。
P6021 洪水
和板子很像,矩阵推一推就出来了。
标签:子树,矩阵,笔记,修改,重链,动态,DP From: https://www.cnblogs.com/cc0000/p/16818381.html