[U53204] 树上背包的优化

题目链接
本文旨在介绍树上背包的优化。
可见例题,例题中 N , M ∈ [ 1 , 100000 ] N,M \in [1,100000] N,M[1,100000]的数据量让 O ( n m 2 ) O(nm^2) O(nm2)的朴素树上背包T到飞起,我们需要考虑优化。
个人会将各种优化讲到极限(当然是本蒟蒻的极限)。
根据一番学习,我也认为上下界优化最简单易理解……
上下界优化这位神犇的博客相当不错了:戳我%他
我也口胡两句吧。
普通做法:

for (j=m+1;j>=1;--j)//枚举背包容量
	for (k=1;k<j;++k)//枚举在子树中选择多少
		f[u][j]=max(f[u][j],f[u][k]+f[v][j-k]);

那么size优化非常简单好想:

for (j=min(m+1,size[u]);j>=1;--j)//枚举背包容量
	for (k=1;k<j&&k<=size[v];++k)//枚举在子树中选择多少
		f[u][j]=max(f[u][j],f[u][k]+f[v][j-k]);

道理也很简单,选完就那么多,肯定不能枚举到超过的。
于是能AC这道题,用时 17 s 17s 17s
但再想想,我们选择的 k k k的下界其实也是会被约束的。
因为选到 j j j的总容量的时候,假定前面的全部取完, k k k都必须要到达一个值才能满足条件。
例子:
s i z e [ u ] = s i z e [ s o n 1 ] + s i z e [ s o n 2 ] + s i z e [ s o n 3 ] size[u] = size[son1] + size[son2] + size[son3] size[u]=size[son1]+size[son2]+size[son3]
我们枚举时,比如 j = s i z e [ s o n 1 ] + s i z e [ s o n 2 ] + a j = size[son1] + size[son2] + a j=size[son1]+size[son2]+a的情况,
我们至少要在 s o n 3 son3

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值