之前补cf场时做到这道题,发现一点思路也没有?然后看了题解发现这是一类codeforces上考烂了的dp专题。所以花了一天时间补了一下。
codeforces上的原博客
SOSdp是一类计算子集贡献的状压dp,如果x&y==x,则我们称y是x的子集(可能不太标准),例如5(101)的子集有4(100)、1 (001)、0。而我们要求的就是
如何求解?我们先设 d p [ m a s k ] [ i ] dp[mask][i] dp[mask][i]表示二进制从低到高(从0开始计数)已经处理完前i位的情况。例如, d p [ 1011011 ] [ 2 ] dp[1011011][2] dp[1011011][2]表示前3项011已经计算完成的状态,所以此时 d p [ 1011011 ] [ 2 ] dp[1011011][2] dp[1011011][2