树上背包

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)\)

posted @ 2025-08-01 14:50  wmq2012  阅读(14)  评论(0)    收藏  举报