枚举子集&高位前缀和
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的子集。
以上是关于枚举子集&高位前缀和的主要内容,如果未能解决你的问题,请参考以下文章
仅公开路由的 .NET OData API 子集(排除 API 返回 404)
UVA 11825 - Hackers' Crackdown 状态压缩 dp 枚举子集
UVa 11825 - Hackers' Crackdown DP, 枚举子集substa = (substa - 1)&sta 难度: 2