高维前缀和

高维前缀和可以求出关于一个集合子集(或超集)的状态的和
从低到高枚举位数,之后枚举集合中的所有元素
总复杂度为(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)的最大值
首先高维前缀和一遍求出是二进制超集的集合是否存在
之后对于每一个数,按位贪心求最大值即可

原文地址:https://www.cnblogs.com/cjfdf/p/9353747.html