周中训练笔记21

来源:互联网 发布:美工刀架规格 编辑:程序博客网 时间:2024/06/14 20:02

      终于考完数据库了,开始全力以赴的学习状压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;

      

原创粉丝点击