1 条题解
-
0
题意回顾
给定一棵 个节点的树,边带权(权值可为负)。
要选出若干条长度恰好为 的简单链(即包含 个节点、 条边),且这些链在点上不相交(边自然也不相交)。
目标是最大化所选链的边权总和。数据范围:,边权绝对值 。
关键难点
- 长度恰好为 4:这意味着一条链涉及 5 个节点,在树上形态比较固定。
- 链不交:选择的链不能共享节点,是点不交路径覆盖的一种特殊情形。
- 边权可负:需要判断选一条链是否划算。
树形 DP 状态设计
由于链长度固定为 ,我们可以枚举链在树上的形态。长度为 的链在树上有两种主要形态:
- 直链:(5 个节点依次相连)
- 星形链:长度 4 的链在树上只能是直链形态,因为树没有环。
所以唯一形态就是 5 个节点连成一条线。
DP 思路
设 表示在 的子树中, 所处的链的未完成部分长度为 时的最大收益。
这里 的含义:
- : 不在任何链中,或 是某条完整链的端点(链已结束)
- : 是某条链的一端,该链已包含 1 条边(还需 3 条边完成)
- : 是某条链的一端,该链已包含 2 条边(还需 2 条边完成)
- : 是某条链的一端,该链已包含 3 条边(还需 1 条边完成)
- : 是某条链的一端,该链已包含 4 条边(链完成)
由于链长恰好 4,所以 取值 。
状态转移
考虑节点 和它的一个子节点 ,边权 。
1. 不将边 用于链
那么 的子树独立处理, 的状态不变,加上 子树的最佳收益(即 )。
2. 将边 用于延长链
- 如果 当前状态为 ,加入这条边后状态变为 (如果 )
- 收益增加
- 同时 的状态要从 转移来,且 与 的状态要匹配
更具体地,枚举 的状态 和 的状态 ,尝试用边 连接:
- 如果 :用这条边连接后形成完整链( 在 子树中已完成 3 条边,加上 完成第 4 条),收益 , 新状态为 (链完成)。
- 如果 :连接后状态变为 (完成链),收益 , 新状态 。
- 如果 :同理,收益 , 新状态 。
- 如果 :收益 , 新状态 。
以及未完成链的延长:
- :开始新链, 状态变为 ,收益
- :延长链, 状态变为 ,收益
- : 状态变为 ,收益
- : 状态变为 ,收益
合并多个子树
节点 可能有多个子节点,我们需要合并它们的贡献。
因为链不能分叉,所以 最多连接两个子节点用于同一条链(作为链上的一个点有度最多 2)。实际上, 在一条链中最多连接 2 个子节点(一进一出),其他子节点必须独立处理。
因此合并时,对每个子节点 ,我们考虑:
- 不连接 :贡献
- 连接 并延长链:根据当前 状态和 状态更新
这是一个经典的树形 DP 合并技巧,需要维护 的各个状态的最大值,并依次用每个子节点更新。
算法步骤
- 任选根节点(如 1)进行 DFS
- 初始化 ,其余
- 对 的每个子节点 (边权 ):
- 创建临时数组 初始为
- 枚举 的当前状态 和 的可能状态 ,考虑:
- 不连接:
- 连接并可能完成链:根据上述规则更新
- 将 复制给
- 最终答案:( 表示以 root 为端点的完整链)
复杂度分析
- 状态数:每个节点 个状态
- 合并时枚举 : 次
- 总复杂度:,可过
总结
本题的关键在于:
- 识别链长固定为 的特殊性
- 设计状态 表示 在链中的位置
- 分类讨论连接边是否用于链,以及是否完成链
- 使用临时数组正确合并多个子树的贡献
通过精细的状态设计和转移,可以在 时间内求出最大收益,解决大规模数据。
- 1
信息
- ID
- 4434
- 时间
- 5000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 1
- 上传者