动态 DP
动态 DP 问题是猫锟在 WC2018 讲的黑科技,一般用来解决树上的带有点权(边权)修改操作的 DP 问题。
例子
以这道模板题为例子讲解一下动态 DP 的过程。
给定一棵
广义矩阵乘法
定义广义矩阵乘法
相当于将普通的矩阵乘法中的乘变为加,加变为
同时广义矩阵乘法满足结合律,所以可以使用矩阵快速幂。
不带修改操作
令
则有 DP 方程:
答案就是
带修改操作
首先将这棵树进行树链剖分,假设有这样一条重链:
设
假设我们已知
答案是
可以构造出矩阵:
注意,我们这里使用的是广义乘法规则。
可以发现,修改操作时只需要修改
具体思路
-
DFS 预处理求出
和 . -
对这棵树进行树链剖分(注意,因为我们对一个点进行询问需要计算从该点到该点所在的重链末尾的区间矩阵乘,所以对于每一个点记录
表示 所在的重链末尾节点编号),每一条重链建立线段树,线段树维护 矩阵和 矩阵区间乘积。 -
修改时首先修改
和线段树中 节点的矩阵,计算 矩阵的变化量,修改到 矩阵。 -
查询时就是 1 到其所在的重链末尾的区间乘,最后取一个
即可。
习题
贡献者:@Tifa@CSPNOIP@Shuhao@kenlig@thredreams@Danni@mgt@H-J-Granger@Mout-sea@sshwy@Henry-ZHR@huhaoo@ljfcnyali
本页面最近更新:2/3/2023, 12:00:00 AM,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用