一道状态定义比较不寻常的树形dp。
因为这道题求的路径和,那么这里用到一个套路:对于每一条边分别计算贡献。这样子我们就可以把边看做点,记 (f_{i,j}) 代表以 (i) 为根的子树,共有 (j) 个黑点,子树内的边对全局的贡献。转移可采用常规的树形dp,关键是权值怎么计算?考虑一条边 (u ightarrow v) 的权值为 (val(u,v)),那么我们枚举 (v) 中的黑点个数,记为 (x),统计经过这条边的黑 ( ightarrow) 黑和白 ( ightarrow) 白的路径条数,分别为 (x imes (m-x)) 和 ((siz[v]-x) imes(n-siz[v]-m+x))。接下来关键的一步是计算时间复杂度,如果每一层都直接 (k^2) 枚举显然是不对的,我们在每一次枚举时只枚举到 (siz),因为黑点数不可能超过总点数,可是这样还是可能被一条链卡常 (k^2)。我们考虑每次把一个新的子树挂到当前根上,这时我们不枚举非法状态(之前没有答案的状态),复杂度就对了。
更具体的证明: