码迷,mamicode.com
首页 > 其他好文 > 详细

【树形背包】bzoj4033: [HAOI2015]树上染色

时间:2018-07-13 20:18:08      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:amp   形式   左右   tps   info   分析   put   class   lock   

仔细思考后会发现和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

Sample Output

17
【样例解释】
将点1,2染黑就能获得最大收益。

题目分析

这题目第一眼看上去根本不像是背包题吧……倒像是个贪心或者奇妙结论题。

但是可以像treecut一样,将答案按照树上每一条边来统计贡献。

技术分享图片

我们把一颗树沿某条边分开,看成这个样子。

那么显然若知道这条边左右两边黑白点各有多少个,就可以计算这个情况下的答案了。

也就是说,如果我们确定一条边来把树分开,那就可以依靠枚举来确定最优答案。

观察一下这个问题是具有最优子结构的,也就是说变成了一个树上背包的形式:左右两边黑白点个数的不同情况各有体积和价值,求最大价值。

我们定义$f[x][i]$表示以$x$为根的子树中,有$i$个黑点,这种情况的最大价值。

技术分享图片

考虑如何转移,

总结

一类难以通过树形结构直接转移的动态规划问题,可以考虑对于边将树划分为两个部分的子问题,再分别维护答案。

【树形背包】bzoj4033: [HAOI2015]树上染色

标签:amp   形式   左右   tps   info   分析   put   class   lock   

原文地址:https://www.cnblogs.com/antiquality/p/9306801.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!