枚举子集&高位前缀和

Posted shanxieng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了枚举子集&高位前缀和相关的知识,希望对你有一定的参考价值。

最近做的题里面有这个东西,于是写一篇博客总结一下吧。

枚举子集

枚举子集就是状压的时候枚举其中的二进制位中的1的子集。直接暴力枚举二进制位时间复杂度是(O(4^n)),但是我们可以发现,对于每一位有以下三种状态,在枚举的子集中为1,在子集中为0且在原状态中为1,以及在原状态中为0。这样,对于1到(2^n)的数中,子集的总数为(3^n),这样,通过一些比较优秀的枚举,时间复杂度即为(O(3^n))。代码如下:

for(int i=s;;i=(i-1)&s) {
    //do sth...
    if(!i) break;
}

其中,对于每次循环的i,枚举的即是s的子集。

以上是关于枚举子集&高位前缀和的主要内容,如果未能解决你的问题,请参考以下文章

枚举大小为k的子集

仅公开路由的 .NET OData API 子集(排除 API 返回 404)

UVA 11825 - Hackers' Crackdown 状态压缩 dp 枚举子集

UVa 11825 - Hackers' Crackdown DP, 枚举子集substa = (substa - 1)&sta 难度: 2

二进制枚举子集技巧

生命(哈密尔顿距离&切比雪夫距离+前缀和)