省流:设计 dp 状态及转移,利用转移在链上复杂度低的特点或单独设计在链上的转移方式(并且这类 dp 合并的复杂度一般与子树大小有关),使得最劣情况相当于一棵满二叉树,得到较为优秀的复杂度。
例题 1
给定一棵树,在树上选出一些点,使所有从根到叶子结点的路径上选出的点的个数相同。求方案数。
设 \(f_{i,j}\) 表示所有从结点 \(i\) 到叶子结点的路径上选出的点的数量都为 \(j\) 个的方案数。转移是简单的。
这个东西看似能用长链剖分优化,但是它在一条链上的复杂度还是太高。于是我们考虑对于一条链(这里链的定义为一段除终点以外其他点只有一个儿子的路径)使用 NTT 来转移,有多个儿子则暴力合并。
\(f_{i,j}\) 中 \(j\) 的上界是 \(siz_i\),因此暴力合并的部分是 \(O(n\log n)\) 的;稍微分析一下,可以构造一个最劣情况:将 \(O(\sqrt n)\) 个点的满二叉树的每一条边换成一条长度为 \(O(\sqrt n)\) 的链,得出 NTT 转移的总复杂度为 \(O(n\log^2 n)\)。
例题 2
标签:结点,limits,sum,转移,树形,一类,复杂度,dp From: https://www.cnblogs.com/umieR/p/18531685给定一棵树,每个点有权值 \(a_i,b_i,v_i\)(\(\sum a_i\leq m\)),给定 \(a_i,v_i\),要求 \(\sum a_i=\sum b_i\) 且 \(\left|\sum\limits_{j=1}^{n}[j\in subtree_i](a_j-b_j)\right|\bmod 2=c_i\),求 \(\sum\limits_{i=1}^{n} \left|\sum\limits_{j=1}^{n}[j\in subtree_i](a_j-b_j)\right|v_i\) 的最小值。