有一棵点数为N的树,树边有边权。给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并
将其他的N-K个点染成白色。将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间距离的和的收益。
问收益最大值是多少。
标签:amp 形式 左右 tps info 分析 put class lock
仔细思考后会发现和51nod1677 treecnt有异曲同工之妙
这题目第一眼看上去根本不像是背包题吧……倒像是个贪心或者奇妙结论题。
但是可以像treecut一样,将答案按照树上每一条边来统计贡献。
我们把一颗树沿某条边分开,看成这个样子。
那么显然若知道这条边左右两边黑白点各有多少个,就可以计算这个情况下的答案了。
也就是说,如果我们确定一条边来把树分开,那就可以依靠枚举来确定最优答案。
观察一下这个问题是具有最优子结构的,也就是说变成了一个树上背包的形式:左右两边黑白点个数的不同情况各有体积和价值,求最大价值。
我们定义$f[x][i]$表示以$x$为根的子树中,有$i$个黑点,这种情况的最大价值。
考虑如何转移,
一类难以通过树形结构直接转移的动态规划问题,可以考虑对于边将树划分为两个部分的子问题,再分别维护答案。
【树形背包】bzoj4033: [HAOI2015]树上染色
标签:amp 形式 左右 tps info 分析 put class lock
原文地址:https://www.cnblogs.com/antiquality/p/9306801.html