P3349 [ZJOI2016]小星星
对于子集\(DP\)的优化一般要上容斥。
如果只是暴力枚举当前点以及子集状态的话一共要\(O(3^n)\),而容斥后可以优化成\(O(n*2^n)\)。
一般容斥都是把条件改成“至多”“至少”如何如何,这样我们枚举状态,然后\(DP\)中就不需要记录子集了。
就是考虑从最原始的暴力\(DP\)设\(f[i][j][S]\)表示在树中\(i\)节点表示原图的\(j\),且子树状态为\(S\)的方案数。转移需要\(O(n^3*3^n)\)。
考虑容斥将条件变成至多,那我们先枚举已用点的状态,然后设\(f[i][j]\)表示当前点\(i\)表示原图的\(j\)的方案数,\(O(n^3*2^n)\)即可求解。