动态dp学习小记

本文介绍了如何使用动态DP解决树形问题,特别是当修改节点权值时,如何通过树链剖分和矩阵快速幂来实现高效更新。文章通过实例解释了动态DP的状态转移,并展示了如何将DP状态转换为矩阵乘法,从而达到O(n log^2 n)的时间复杂度。
摘要由CSDN通过智能技术生成

据说这东西猫锟在WC2018讲过,怎么一点印象都没有呢?当时应该是在冬眠

NOIP2018T6如果用动态dp去看就是一道裸题,不过因为询问是相互独立的,即修改没有时效性,可以直接用倍增代替动态dp。


先看一道题:

P4719 【模板】动态dp

如果没有修改,这题就是树形dp入门题:没有上司的晚会

f ( x , 0 / 1 ) f(x,0/1) f(x,0/1)分别表示以x为根的子树中,选x的最大独立集,不选x的最大独立集。

则:
f ( x , 0 ) = ∑ y ∈ s o n ( x ) m a x ( f ( y , 0 ) , f ( y , 1 ) ) f(x,0)=\sum_{y∈son(x)}max(f(y,0),f(y,1)) f(x,0)=yson(x)max(f(y,0),f(y,1))
f ( x , 1 ) = v [ x ] + ∑ y ∈ s o n ( x ) f ( y , 0 ) f(x,1)=v[x]+\sum_{y∈son(x)}f(y,0) f(x,1)=v[x]+yson(x)f(y,0)


现在我们要修改一个点x的权值v,这个修改显然只会影响到x到root路径上所有点的f,问题在于如何做到快速修改。

既然是修改一条路径,我们可以想想树链剖分。

g ( x , 0 / 1 ) g(x,0/1) g(x,0/1),意义是x为根的子树中,把重儿子的子树删掉的x选(1)/不选(0)的最大独立集。

对于一条x到root路径的修改, g g g受到影响的显然只有x和每条重链顶的父亲。

由于重链只有log条,所以这里暴力修改即可。

那么问题在于如何快速进行重链上的dp转移,先写一下转移:
f ( i , 0 ) = g ( i , 0 ) + m a x ( f ( i + 1 , 0 ) , f ( i + 1 , 1 ) ) f(i,0)=g(i,0)+max(f(i+1,0),f(i+1,1)) f(i,0)=g(i,0)+max(f(i+1,0),f(i+1,1))
f ( i , 1 ) = g ( i , 1 ) + f ( i + 1 , 0 ) f(i,1)=g(i,1)+f(i+1,0) f(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值