【刷题笔记】p12002 吃猫粮的玉桂狗

思路

树形 DP
很好注意到这是一道树形 DP 题目。
可以很好想到设 \(f_{i,j}\) 表示当前结点 \(i\) 的权值为 \(j\) 时的方案数。
转移方程:\(f_{i,j}=\sum f_{v, k} * [ok_{i,j}=1]\)
但是这么做为什么是错的呢?因为每种权值有一个数量限制 \(c\),直接这么做会多算一些情况,所以我们就要不合法的情况减掉。
考虑容斥,注意题目中的一个性质,每个权值的数量 \(\ge \frac{n}{2}\),所以至多会有一种权值超出数量。
树上背包 计算不合法情况,设 \(f_{u,j,k}\) 表示 \(u\) 点点权为 \(j\) 且超限制的点权 \(P\) 已经有 \(k\) 个的方案数。
转移方程:\(f_{u,i,k_1+k_2} = \sum f_{u,i,k_1} \times f_{v,j,k_2}\)
最后用总方案数减去不合法方案数就可以了。
时间复杂度 \(O(n^5)\)\(n,m\) 同阶)。

posted @ 2025-05-28 17:04  GuoSN0410  阅读(13)  评论(0)    收藏  举报