1 条题解
-
10
Rikka with Match
某人号 Sam 尝曰:最大独立集乃树上背包也。
余曰:误人子弟。最大独立集乃贪心也。
给定 个点的树,求有多少中割边的方案使得最大匹配大小被 整除。
。
将最大匹配转化为最大独立集后,首先我们应该想如何刻画最大独立集:
贪心:
按深度从大到小选择点。只要这个点可以选择就选择。
那么我们就可以得出一个 DP 状态并利用上述贪心转移:定义 为 的子树,最大独立集模 为 ,且 选择/不选择的方案数。
然后初始化是比较简单的,因为按照贪心,一开始是时候只有 一个点,于是必须选择,那么就有 ,其余为 。
考虑仿照树形背包,逐步加入儿子 。
那么对于儿子 ,我既可以断掉这条边,也可以不断。
Case #1:断
这个时候 的选择就与 无关了,那么只需要对第二维进行树形背包即可(注意,我写的所有转移的第二维都是在模意义下的):
$$f_{x,i,0/1}\leftarrow\sum_{j+k=i}f_{x,j,0/1}(f_{u,k,0}+f_{u,k,1})$$Case #2:不断
此时 的选择就会影响 了。
那么不妨枚举 的状态 和 的状态 。
Case #2.1
若 ,则 必然不会被选择,那么此时 的状态 就不会有影响了,因此有转移:
$$f_{x,i,0}\leftarrow\sum_{j+k=i}f_{x,j,0}(f_{u,k,0}+f_{u,k,1})$$Case #2.2
若 ,则根据贪心,此时 依然继续选择,因此:
Case #2.3
若 ,那么此时根据贪心, 的状态要有选择变为不选择,即,最大独立集的大小会 。
那么同样的,我们也可以得出转移:
$$f_{x,i-1,0}\leftarrow\sum_{j+k=i}f_{x,j,1}f_{u,k,1}$$总结
上面的四种转移转移完成后,这题就可以以 的复杂度完成,预期得分 。
然后就是一个可能会被遗忘的优化:这个转移本质上只是树形背包的变体,因此只需要在转移的时候,将上界 换成 和 就行了。
这样就可以做到 了。
- 1
信息
- ID
- 2787
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 21
- 已通过
- 4
- 上传者