状态设计与转移
状态设计
f[u][i] 表示当前已遍历的u𝑢子树内,取 i 个黑点的最大收益。
siz[v] 表示当前已遍历完的 v𝑣子树内的节点数。
状态转移
在回溯时,考察 (u,v)(𝑢,𝑣) 边的贡献。这条边的贡献取决于其下方和上方各取多少个黑点以及多少个白点。
黑点贡献:如果 v𝑣子树内取k𝑘 个黑点,v𝑣 子树外取 m−k𝑚−𝑘 个黑点,根据乘法原理,黑点贡献为k∗(m−k)∗w𝑘∗(𝑚−𝑘)∗𝑤。
白点贡献:v𝑣子树内有siz[v]−k𝑠𝑖𝑧[𝑣]−𝑘个白点,v 子树外有 (n−siz[v]−(m−k))(𝑛−𝑠𝑖𝑧[𝑣]−(𝑚−𝑘)) 个白点,根据乘法原理,白点贡献为(siz[v]−k)∗(n−siz[v]−(m−k))∗w(𝑠𝑖𝑧[𝑣]−𝑘)∗(𝑛−𝑠𝑖𝑧[𝑣]−(𝑚−𝑘))∗𝑤。
然后合并已知 u、v𝑢、𝑣的贡献和(u,v)(𝑢,𝑣) 边的贡献。注意状态枚举次数不超过 m 即可。
时间复杂度 O(n∗m)𝑂(𝑛∗𝑚)。