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))即可求解。