树上背包上下界优化
前言
看到一个比较牛(sao)的复杂度证明,记一下。
基本的树上背包问题长这样(就是把花费为1的0-1背包搬上了树):现在有 门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程 a 是课程 b 的先修课即只有学完了课程 a,才能学习课程 b)。一个学生要从这些课程里选择 门课程学习,问他能获得的最大学分是多少?()
树形背包的复杂度是 ,比起平时背包的 差多了去了。但树形背包真的可以 。
代码与思想
核心代码(优化后,选自OIWIKI):
|
注意如上代码中,每个数都肯定都只会被合并前的的f
更新,所以不会出现“完全背包”的情况。
递归,在访问完每个子树时求解。设 点花费为 ,收益为 , 表示点 在访问到当前子树时所有访问过的字树的价格和与点 的和, 为点 中给 点“价值”时的最大收益。在普通DP式 的基础上添加限制 即可。
证明
这个DALAO证得太好了,我就不写了其实虽然这个DALAO讲的十分好懂,但考虑到 和 同级,这样做似乎没有必要。
后话
以 都可以过的此题为例虽然就5个点,还是比快不少:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 felixesintot's blog!
评论