个人对 状压 的理解:将一个复杂的状态用一个 二进制数 来表示
位运算
位运算是状压里很重要的东西(可见算法进阶指南0x01)
包括了
与 & (二进制下 相同位 同为1 ,该位结果为 1,否则为0,101010 & 100110 = 100010)
或 | (二进制下 相同位 任意一个1 ,该位结果为 1,否则为0,101010 | 100110 = 101110)
非 ~ (二进制下 对每一个二进制位 取反操作 ~ 010010 = 101101,每个二进制数首位为符号位 0 为正,1为负,值得注意的是 ~ a = - a - 1;
异或 ^ (二进制下 相同位 不同 ,该位结果为 1,否则为0,101010 ^ 100110 = 001100)
左移 << (类似于 * 2 ^ K,即 N << K = N * 2 ^ K)
右移 >> (类似于 / 2 ^ K,即 N >> K = N / 2 ^ K)
下面是一些常用的位运算操作
安利题目:
状压DP
我理解的状压DP就是将一个DP变量中的状态用二进制数压缩以便于存储 dp[state][][]……,state就是一个非负整数,可写成01串的形式,可表示为每个单位的取或者不取,通俗的来说,就是把一个只有0和1的数组或是字符串压缩成一个非负整数。(一般数具规模很小 状态数量为2 ^ N - 1,N一般在十几左右)
状态设计还是要看DP多加练习,推荐几道题目练练:
UVA10817 校长的烦恼 Headmaster’s Headache
P5911 [POI2004]PRZ
P2831 愤怒的小鸟
P5997 [PA2014]Pakowanie
P2704 [NOI2001]炮兵阵地
此部分状压DP经典题目很多就不再列举。
插头DP
//待更新