【题解】SDOI 2017 苹果树
注意到深度限制相当于白给一条链,剩下随便乱选,这样就能忽略深度限制。接下来,选取的这条链将整个树分成了两部分,考虑对这两部分求解,然后合并。
树上的一类带依赖的背包问题的常见套路就是,将树的后序遍历撤下来,令 \(f_{i,j}\) 表示后序遍历第 \(i\) 个,选了 \(j\) 个,转移分两种:
- 不选这个点,那么子树都不能选,即 \(f_{i,j}\) 从 \(f_{i-siz_u,j}\) 转移即可(跳过这个子树)。
- 选这个点,枚举选多少个,即 \(f_{i,j}\) 从 \(f_{i-1,j-t}+tv_u\) 转移即可。
后面这个式子可以用单调队列优化做到 \(O(nk)\) 。
注意到如果直接做一遍,然后将所有点的儿子顺序反着来跑后序遍历再做一遍,将两遍的结果拼在一起,就计算了除了这条链的其他点的贡献。
因此将每个点拆成两个(出现次数为 \(1+(a_i-1)\),出现次数为 \(1\) 的做出现次数为 \(a_i-1\) 的父亲),这样的话完美解决了拿去这条链后 \(a_i\) 改变的情况,同时也将所有的点都能计算进来。

浙公网安备 33010602011771号