我与旧事归于尽,来年依旧迎花开|

dayz_break

园龄:7个月粉丝:5关注:6

2024-08-27 11:05阅读: 12评论: 2推荐: 0

dp做题记录

树形 dp

  • P3177 [HAOI2015] 树上染色

    初看此题时,dp 状态很明显是两维,但是合并子树时答案难于统计,然后……就不会了qwq

    既然不通,考虑改变 dp 数组的含义,记 dpi,j 表示当前 i 的子树中将 j 个点染黑对总答案的贡献

    但是这样直接计算两点距离就变得更难了,考虑两点的路径统计,将统计相同颜色点两两之间的距离转化为统计每个边被计数的次数。于是我们每次进行转移时只需要考虑 i 到它的儿子 j 的边 ei,j 对总答案的贡献,于是有 dp 方程:

    dpu,j=dpu,jk+dpv,k+eu,vk(mk)+eu,v(sizvk)(nmsizv+k)

    其中 n 为点的个数,m 为总的可以允许染成黑色点的个数,eu,v 表示 uv 边的权值,sizu 表示以 u 为根的子树的大小,jk 均为枚举的染黑点的个数。

    但是这样转移很明显是 O(nm2) 的,于是我们在枚举每一个 m 时,给予 m 一个上下界限制,最大可能地去优化时间复杂度,于是有了 m 的限制:m[max(0,jsizu+iszv),min(j,sizv)]

    可以证明,这样的时间复杂度是接近 O(nm) 的。

    代码

  • P7310 [COCI2018-2019#2] Deblo

    注意到位运算每一位都是独立的,考虑将权值的每一位拆开,单独考虑每一位对答案的贡献。

    先枚举每一位,这样原树就变成了一颗只有 01 的树。很明显只有当路径上的 1 的个数为奇数时,这条路径才会对答案产生贡献。

    dpu,0 表示路径的一个端点为 u,另一个端点在 u 的子树,路径上的 1 的个数为偶数时,这样的路径的条数。同理 dpu,11 的个数为奇数。

    转移时进行分类讨论:

    • 若当前的节点 uw 位是 1,那么对于其每一个子节点 v,有 dpu,0+=dpv,1,dpu,1+=dpv,0
    • 若当前的节点 uw 位是 0,那么对于其每一个子节点 v,有 dpu,0+=dpv,0,dpu,1+=dpv,1

    考虑如何计算答案,显然对于一条路径只有两种情况:

    • lcaa,b 不为 a 或者 b,有 ans+=dpu,1×dpv,0+dpu,0×dpv,1,其中 vu 的子节点。
    • lcaa,ba 或者 b 其中一个,有 ans+=dpu,1

    时间复杂度 O(nlogV),其中 V 为值域。

本文作者:dayz_break

本文链接:https://www.cnblogs.com/dayz-break/p/18382280

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   dayz_break  阅读(12)  评论(2编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起