终于考完数据库了,开始全力以赴的学习状压DP了,但是我发现状压DP主要使用位运算实现,这块有点搞不太懂。
所谓状压就是把每一个元素的选取与否对应到一个二进制位里,从而把状态压缩成一个整数,方便了计算和维护。
至于解法需要保存一定的状态数据,每个状态数据通常情况下是可以通过2进制来表示的。这就要求状态数据的每个单元只有两种状态,比如说棋盘上的格子,放棋子或者不放,或者是硬币的正反两面。这样就可以用0或者1来表示状态数据的每个单元,而整个状态数据就是一个0、1组成的二进制数。
找了一些状压DP常用的位运算:
1、对x取反:~x
2、x+1(x为偶数):x|1
3、2x:1<<x
4、2−x:1>>x
5、x的对应值(例如0对1,2对3,8对9):x^1
6、构造0~n-1位二进制数全部为1:(1<<n)-1
7、构造形如10,100,100000即[0, k-1]全部为0,[k,k]为1,这样的二进制数:1<<(k-1)
状压DP常用:
1、将a的第k位修改为1:a |= 1<<k;
2、将a的第k位修改为0:a &= ~(1<<k);
3、取第k位:a>>k & 1;