子树合并背包类型的dp的复杂度证明

11 篇文章 0 订阅
3 篇文章 0 订阅

状态形如 f[x][j] f [ x ] [ j ] 表示 x x 子树内选了j个,转移形如 f[x][j+k]=f[x][j]f[y][k] f [ x ] [ j + k ] = ∑ f [ x ] [ j ] ∗ f [ y ] [ k ]
假设树上有n个点,第二维限制为k(最多选k个)
我们熟知,这样dp复杂度上界是n^2的。因为合并大小为a,b的子树复杂度是a*b,可以看成a子树内任选一点,b子树内任选一点进行匹配,不管怎么合并任意两个点只会在其lca匹配一次,所以是n^2的。
但是严格分析一下复杂度,可以得到更好的上界:O(nk)
首先,定义大小超过k的子树为大子树,小于k的为小子树。

一个极小的大子树一定是由若干个极大的小子树合并而成的,而且合并的过程中就会从极大的小子树变成极小的大子树。假设所有的极大的小子树的大小分别为x1,x2,x3…..xm,显然x1+x2+…+xm<=n,将这些小子树并入大子树的复杂度为k*(x1+x2+…+xm)<=nk,可以认为是每个极大的小子树被消灭掉所产生的总时间代价不超过nk

考虑一个极大的小子树(大小x<=k)内部合并上来的复杂度,由上面的分析知是x^2的
因此每个小子树内部合并的复杂度就是x1^2+x2^2+…+xm^2,xi<=k,显然当尽量多的xi取到k这个值才会更大,因为假设 xi=n ∑ x i = n 为定值,x1>x2,如果让x1++,x2–,上面那个值会变大。这样复杂度就是n/k*k^2=nk

最后,考虑将所有的极小大子树合并成整棵树的复杂度,显然极小的大子树互不包含,因此极小的大子树个数不会超过n/k个,而每合并两个的时间开销是k^2,因此这部分复杂度是n/k*k^2=nk

综上,复杂度上界为O(nk)

  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值