Description
给定一棵 $n\ (1 \leq n \leq 6 \times 10^3)$ 个点的树,点 $i\ (1 \leq i \leq n)$ 的点权为 $r_i\ (-128 \leq r_i \leq 127)$ 。现在需要从中选取若干个点,使这些点的点权和最大,但规定子节点和父节点不能同时选,求最大点权和。
Source
Solution
考虑 树形DP 。
状态:
用 $f_{0,u}$ 表示在节点 $u$ 的子树中,不取 $u$ 的最大点权和;
用 $f_{1,u}$ 表示在节点 $u$ 的子树中,取了 $u$ 的最大点权和。
初始:
无
转移:
当不取节点 $u$ 时,$u$ 的子节点取和不取都可以,显然取其中较大的更优,所以 $f_{0,u}$ 应当等于 所有子节点 取 与 不取 的 较大值 之和。
当取节点 $u$ 时,$f_{1,u}$ 的最小值为 节点 $u$ 的点权,同时 $u$ 的子节点只能不取,所以 $f_{1,u}$ 还应当加上 所有子节点不取 的和。
答案:
答案是在根节点的子树中,取 和 不取 根节点的较大值。
时间复杂度为 $O(n)$ 。
Code
1 |
|