高维前缀和

高维前缀和可以求出关于一个集合子集(或超集)的状态的和
从低到高枚举位数,之后枚举集合中的所有元素
总复杂度为\(O(n2^n)\)

int n,f[1048576];//n为位数
for(RG int i=0;i<n;i++)
    for(RG int j=0;j<(1<<n);j++)
        if(j&(1<<i))f[j]+=f[j^(1<<i)];

一个问题:
给定一个长度为\(n\),取值为\([0,2^m)\)的数组,取出两个数\(a,b\),求\(a|b\)的最大值
首先高维前缀和一遍求出是二进制超集的集合是否存在
之后对于每一个数,按位贪心求最大值即可

posted @ 2018-07-23 11:26  cjfdf  阅读(377)  评论(0编辑  收藏  举报