题解 P6293 【[eJOI2017]经验】
Peanut_Tang
·
·
题解
题意简析
给定一个 n 个点的有根树,点有点权。求一个方案,把树剖成若干条链,使得:
1、每个点都属于唯一的一条链(单一个点也算一条链);
2、一条链上的任意两点都有子孙关系;
3、所有链的点权极差之和最大。
输出这个最大值。
官方题解搬运
考虑一个DP,设:
$f_{u,0}$ 为覆盖以 $u$ 为根的子树的最大答案;
$f_{u,1}$ 为以 $u$ 为根的子树中,过 $u$ 的这条链还没有选定,但是选定了这条链上的最大值的最大答案(链上的最大值会预先加上);
$f_{u,2}$ 为以 $u$ 为根的子树中,过 $u$ 的这条链还没有选定,但是选定了这条链上的最小值的最大答案(链上的最小值会预先减去)。
答案显然就是 $f_{1,0}$ 。
我们考虑转移,先考虑 $f_{u,1}$ ,我们分两类情况讨论(下面 $S$ 表示 $\sum_{v\in son_u} f_{u,0}$ ):
1、 $u$ 为它所在的这条链的低端,这时 $f_{u,1}=w_u+S$ ;
2、 $u$ 不为它所在的这条链的低端,这时,若选定向儿子 $p$ 伸展,则 $f_{u,1}=S-f_{p,0}+f_{p,1}$ 。
所以我们可以得到: $f_{u,1}=S+max(w_u,max_{v\in son_u}(f_{v,1}-f_{v,0}))$ 。
类似地: $f_{u,2}=S+max(-w_u,max_{v\in son_u}(f_{v,2}-f_{v,0}))$ 。
再考虑 $f_{u,0}$ 的转移,我们仍然分两类情况讨论:
1、 $u$ 这个点是它所在的这条链的最小值,这时: $f_{u,0}=f_{u,1}-w_u$ ;
2、 $u$ 这个点是它所在的这条链的最大值,这时: $f_{u,0}=f_{u,2}+w_u$ 。
最后显然取两个最大值。
综上,时空复杂度均为 $O(n)$ ,可通过本题。