【树上dp】小塔的魔法树:dp顺序的巧妙变换

n(5e3) 个点的树,点有权值,选一个包含 1 的联通子图,要求权值和不超过 m(5e3),求方案数。

正常的思路是树上背包,但是由于每个点的权值不是 1,直接背包复杂度是错的。但从另一个角度来说,普通的树上背包是随便选点的,但是这题如果一个点不选那么这棵子树也不选,所以要从这个角度出发 dp。

最后选出来的子图可以看作是从以 1 为根的树里面挖去几棵子树。所以一个点的抉择是要么选这个点,然后看他们的子孙怎么选,要么是不选这个点,子孙可以全部跳过。原本的 dp 顺序是树的后序遍历,即先 dp 完子孙之后在算自己的 dp 值,这显然没有完全利用好题目性质(\(u\) 不选的话子树也不选,\(v\) 选的话祖先必须选)。

一个合理的 dp 顺序是前序遍历,即按 dfs 序 dp,\(f[i][j]\) 是考虑完 dfs 序为 \(i\) 以前的所有点已经选了 \(j\) 那么多的权值,决策是否选 \(i\), 这样可以 \(O(1)\) 转移。

posted @ 2025-05-19 00:42  nkxjlym  阅读(37)  评论(0)    收藏  举报