树形背包bzoj4033: [HAOI2015]树上染色
Posted antiquality
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树形背包bzoj4033: [HAOI2015]树上染色相关的知识,希望对你有一定的参考价值。
仔细思考后会发现和51nod1677 treecnt有异曲同工之妙
Description
有一棵点数为N的树,树边有边权。给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并
将其他的N-K个点染成白色。将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间距离的和的收益。
问收益最大值是多少。
Input
第一行两个整数N,K。
接下来N-1行每行三个正整数fr,to,dis,表示该树中存在一条长度为dis的边(fr,to)。
输入保证所有点之间是联通的。
N<=2000,0<=K<=N
Output
输出一个正整数,表示收益的最大值。
Sample Input
5 2
1 2 3
1 5 1
2 3 1
2 4 2
1 2 3
1 5 1
2 3 1
2 4 2
Sample Output
17
【样例解释】
将点1,2染黑就能获得最大收益。
【样例解释】
将点1,2染黑就能获得最大收益。
题目分析
这题目第一眼看上去根本不像是背包题吧……倒像是个贪心或者奇妙结论题。
但是可以像treecut一样,将答案按照树上每一条边来统计贡献。
我们把一颗树沿某条边分开,看成这个样子。
那么显然若知道这条边左右两边黑白点各有多少个,就可以计算这个情况下的答案了。
也就是说,如果我们确定一条边来把树分开,那就可以依靠枚举来确定最优答案。
观察一下这个问题是具有最优子结构的,也就是说变成了一个树上背包的形式:左右两边黑白点个数的不同情况各有体积和价值,求最大价值。
我们定义$f[x][i]$表示以$x$为根的子树中,有$i$个黑点,这种情况的最大价值。
考虑如何转移,
总结
一类难以通过树形结构直接转移的动态规划问题,可以考虑对于边将树划分为两个部分的子问题,再分别维护答案。
以上是关于树形背包bzoj4033: [HAOI2015]树上染色的主要内容,如果未能解决你的问题,请参考以下文章