状态压缩DP学习笔记


状态压缩DP学习笔记

永远填不满的坑。
单纯只是为了防止状压DP忘得一干二净而写的。

关于状压DP

其实就是一种暴力的枚举,只有在数据很小时才能使用。一般情况下是 \(n \le 20\)
比如说在方格中放置棋子,对于每个格子,都有放或不放两种可能,状压就是将每一种情况都表示出来,用二进制的形式。

比如在二进制下:$$0101(2)$$

就可以表示,第 \(1\) 和 第 \(3\) 个格子没有放,而第 \(2\) 和第 \(4\) 个格子放了。

因为涉及到进制转换,所以用到位运算的情况很多。
首先是基础的三个位运算

  • 与:&,二进制下对应位两个数均为 \(1\) 时值才为 \(1\),否则为 \(0\)
  • 或:|,二进制下对应位两个数有一个为 \(1\) 时值就为 \(1\)
  • 异或:^,二进制下对应位两个数不同时值为 \(1\),否则为 \(0\)

下面只是列出一些例子:

  • 右移一位:x>>1
  • 左移一位,并加上0/1:x<<1 / x<<1+1
  • 最后一位取反:x^1
  • 求二进制下 \(x\) 中有几个 \(1\)while(x)x&=(x-1),sum++;
  • 二进制下 \(x\) 的第 \(i\) 位是否为 \(1\)x&(1<
  • \(x\) 个物品时的组合方法数:(1<(因为 \(0\) 也是一种情况)

2022/3/3