第一次见这种 DP 方式,好神仙……
考虑设 fu,i 表示 u 子树内的点确定了排列中的 i 个相对位置确定的,不相邻的连续段时这些连续段的贡献。
则考虑使用类似背包的转移方式,逐个儿子地合并答案。
考虑如何合并 fu,j 与 fv,k 至 fu,i,其中 v 为 u 的一个儿子。
由于相对位置确定且不相邻,所以合并后会有 j+k−i 对相邻的位置产生贡献;而显然其 LCA 均为 u,故贡献为 fu,j⋅fv,k⋅gi,j,k⋅depj+k−iu
其中 gi,j,k 表示将 j 个相对位置确定且不相邻的连续段和 k 个相对位置确定且不相邻的连续段合并为 i 个相对位置确定且不相邻的连续段的方案数。
这个也可以 DP 出来,具体是枚举这 i 个连续段的第一个连续段由 j,k 个连续段中各多少个组成,则 gi,j,k=min{j,k}∑u=12gi−1,j−u,k−u+min{j−1,k}∑u=0gi−1,j−u−1,k−u+min{j,k−1}∑u=0gi−1,j−u,k−u−1
然而这样需要 O(n4) 预处理,这就很不爽了。
但是注意到转移过来的状态的 j−k 的值都是确定的,所以考虑用前缀和的方式维护,注意不要计入超出范围的贡献。
代码:
1 |
|