ddp就是通过加法对min/max的分配率把原来不好维护的dp转移搞成可以遵循分配率的矩阵形式,自然就以用一些数据结构去维护
比如说这题求最大权独立集
先写出转移方程
dp[u][0/1]表示该点取或者不取时该点为根的子树的最大权独立集
dp[u][0]= ∑ \sum ∑max(dp[v][0],dp[v][1])
dp[u][1]=( ∑ \sum ∑dp[v][0]) +val[u]
数据结构维护的话就是LCT或者树链剖分
LCT好久不写了懒得写,就想想树剖吧
考虑线段树上查询的一个区间关系大抵是父亲和重儿子
那么就令g[u][0]表示该点不选时除重儿子以外的dp值之和
g[u][0]= ∑ ( v ≠ s o n ) \sum(v\neq son) ∑(v̸=son)max(dp[v][0],dp[v][1])
g[u][1]=( ∑ ( v ≠ s o n ) \sum(v\neq son) ∑(v̸=son)dp[v][0])+val[u]
重写转移方程
dp[u][0]=max(dp[son][0],dp[son][1])+g[u][0]
dp[u][1]=dp[son][0]+g[u][1]
写出矩阵
[ g [ u ] [ 0 ] g [ u ] [ 0 ] g [ u ] [ 1 ] − ∞ ] [ d p [ s o n ] [ 0 ] d p [ s o n ] [ 1 ] ] = [ d p [ u ] [ 0 ] d p [ u ] [ 1 ] ] \left[ \begin{matrix} g[u][0]& g[u][0] \\ g[u][1] & -\infty \end{matrix} \right] \left[ \begin{matrix} dp[son][0] \\ dp[son][1] \end{matrix} \right]= \left[ \begin{matrix} dp[u][0] \\ dp[u][1] \end{matrix} \right] [g[u][0]g[u][1]g[u][0]−∞][dp[son][0]dp[son][1]]=[dp[u][0]dp[u][1]
洛谷P4719 【模板】动态dp
最新推荐文章于 2021-01-22 22:31:51 发布