Description
有一棵高\(n\)的完全二叉树,每个点可以染成黑色或者白色,黑叶子最多有\(m\)个。
如果一个叶子\(i\)和他的第\(j\)级别祖先都是黑的,那么会有一个\(w_{i, j}\)的收益。若都是白色,则有\(f_{i, j}\)的收益。求最大收益。
\(1\leq n\leq 10, m\leq 2^{n - 1}, 0\leq w_{i, j}, f_{i, j}\leq 2000\)。
Solution
如果说是在祖先上状压记录叶子的信息的话,那么状态会炸。那么我们反过来,去状压记录祖先的信息。
定义状态\(d_{i, j, s}\)表示子树\(i\)的祖宗的状态为\(s\),子树内黑叶子有\(j\)个的最优解。转移的话在叶子上考虑\(s\)的贡献,非叶子结点背包即可。
那问题来了,这样的话时间空间不会炸吗?
先说空间。注意到\(j\)一定是某个叶子给上面的点做了贡献而成,一个叶子的贡献是\(\sum_{i = 1}^{n - 1} 2^{i - 1}\),也就是\(2^{n - 1}\),叶子有\(2^{n - 1}\)个,所以总的来说空间复杂度是一个\(2^{2n - 2}=O(2^{2n})\)的。
再说时间。考虑对于一个第\(i\)层的点,所有\(j\)的背包的枚举的复杂度的和的上限为\((2^{n - i})^2 = 2^{2n - 2i}\),然后这一层不考虑\(j\)的状态数为\(2^{i - 1}2^{i - 1}\)(还不到这个数……),因此可以认为这一层对时间复杂度的贡献为\(O(2^{2n})\),总共\(n\)层所以总时间复杂度为\(O(n2^{2n})\)。
Code
1 |
|