状态压缩DP

常见运算

//集合A、B,元素c --> int A,B   c = 0 ~ 31
//A中插入c
A |= (1<<c)
//A中去除c
A &= ~(1<<c)
A ^= (1<<c)
//A B 合并
A | B
//判断B是不是A的子集
return (A&B) == B
//判断c在不在A里
return A & (1<<c)
//lowbit
return x & (-x);
//枚举A的全部子集
for(int i = A; i; i = (i-1) & A)
{
    //do something
}
// 将一个数的最低位到最高位(最高位为从高到低第一个1)全部置1
int num = 0b10110;
int mask = 0;
while (mask < num)
{
    mask = (mask << 1) + 1;
}
posted @ 2021-01-10 22:15  miyanyan  阅读(48)  评论(0编辑  收藏  举报