树上背包
P2015
f[u][i]表示u号节点保留j个树枝的最大苹果数,以1为根,最终答案为f[1][m]。
转移时有3种情况
- 1 全部转移给左儿子,因为u保留了i个树枝,那么全部转移给左儿子时,左儿子只能用i-1个树枝,也就是f[v1][i-1],因为联通根和左儿子还有一条边,答案在加上这条边上的苹果树w1
- 全部转移给右儿子,和左儿子差不多
- 一部分转移给左儿子,一部分转移给右儿子。枚举分给左儿子的树枝数j,因为两个子树一共要用i-2(还有连接子树和根的边)所以右儿子此时的所用边数就是i-2-j,最后用两边此时的结果再加上两条边上的苹果数就是当前答案。
全部初始为0,因为去最大收益
P2014
f[u][i]表示在第i个节点选j门课的最大价值,因为避免出现森林的问题,所以虚拟0节点作为根节点,所以最终答案就是以0为根选m门课f[0][m]。转移时枚举当前子树的选课数j和子节点的选课数k,那么当前面以遍历的节点选完以后加上k就是总和,所以前面,也就是现在还没有更新的f[u][j-k],再加上子节点选k个的,和原有值去最大值更新。
初始值当前节点选一门课就是这门课的分数
U53204
注意到枚举了很多无用状态可以优化
- 当前子树j的选课数量最多就是子树的所有课都选了,也就是子树的节点数量,当然也不能超过m
- k最大是子节点的子树数量,原因和上面是一样的,当然,不能超过j,因为限制了整棵子树只有这么多节点。然后u节点的j-k最大也只有siz[u],所以转过来,k的下线就是j-siz[u],然后空间比较极限,用vector
复杂度分析
每个点对都只会在 lca处合并一次,所以总的复杂度是\(O(n^2)\)的

浙公网安备 33010602011771号