dp做题记录
树形 dp
-
初看此题时,dp 状态很明显是两维,但是合并子树时答案难于统计,然后……
就不会了qwq。既然不通,考虑改变 dp 数组的含义,记
表示当前 的子树中将 个点染黑对总答案的贡献。但是这样直接计算两点距离就变得更难了,考虑两点的路径统计,将统计相同颜色点两两之间的距离转化为统计每个边被计数的次数。于是我们每次进行转移时只需要考虑
到它的儿子 的边 对总答案的贡献,于是有 dp 方程:其中
为点的个数, 为总的可以允许染成黑色点的个数, 表示 到 边的权值, 表示以 为根的子树的大小, 和 均为枚举的染黑点的个数。但是这样转移很明显是
的,于是我们在枚举每一个 时,给予 一个上下界限制,最大可能地去优化时间复杂度,于是有了 的限制: 。可以证明,这样的时间复杂度是接近
的。代码。
-
注意到位运算每一位都是独立的,考虑将权值的每一位拆开,单独考虑每一位对答案的贡献。
先枚举每一位,这样原树就变成了一颗只有
和 的树。很明显只有当路径上的 的个数为奇数时,这条路径才会对答案产生贡献。记
表示路径的一个端点为 ,另一个端点在 的子树,路径上的 的个数为偶数时,这样的路径的条数。同理 为 的个数为奇数。转移时进行分类讨论:
- 若当前的节点
第 位是 ,那么对于其每一个子节点 ,有 。 - 若当前的节点
第 位是 ,那么对于其每一个子节点 ,有 。
考虑如何计算答案,显然对于一条路径只有两种情况:
不为 或者 ,有 ,其中 是 的子节点。 为 或者 其中一个,有 。
时间复杂度
,其中 为值域。 - 若当前的节点
本文作者:dayz_break
本文链接:https://www.cnblogs.com/dayz-break/p/18382280
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步