1.状态压缩:
DP算法中,状态是一个比较重要的量
然而有些DP算法状态多而且杂,那么,对于这样的DP,我们能不能稍做优化?
在背包问题时,我们知道,有些状态是可以被压掉的,那么,换到别的DP中,我们有没有办法压掉一些状态?
有:用二进制数来保存状态,即这里指的状态压缩
要和二进制数打交道,必然少不了位运算,引入正题
1.位运算类型性质:
按位与and(&):同为1则返回1,否则返回0;
按位或or(|):存在1则返回1,否则返回0;
按位取反not(~):是1返回0,是0返回1;
按位异或(^):相同返回0,不同返回1;
左移(<<):原数自乘2的(位移数)次幂
右移(>>):原数自除2的(位移数)次幂
优先级:not>算术>左移/右移>关系运算>and>or>xor>逻辑
加括号!加括号!位运算一定要加括号!!!!
2.使用位运算实现操作:
x>>1 去末位0
x<<1 末位添0
x<<1+1 末位添1
x|1 末位变1
x&(~1) 末位变0
x^1 末位取反
x|(1<<(k-1)) 右数第k位变1
x&~(1<<(k-1)) 右数第k位变0
x^(1<<(k-1)) 右数第k位取反
x&(x+1) 从最右面开始,把连续的1变成0
x|(x+1) 从最右面开始,把第一个0变成1
x|(x-1) 从最右面开始,把连续的0变成1
x&((1<<k)-1) 取末尾k位
x|((1<<k)-1) 把末尾k位变成1
x^((1<<k)-1) 末尾k位取反
(x>>(k-1))&1 取右数第k位