public static int countMaxOrSubsets(int[] nums) {
int n=nums.length;
int[] dp=new int[1<<n];//以二进制数表示选择哪些元素作为子集,dp[i]表示子集按位或的值
int len=1;//记录上一层子集数量,节约时间,空集为0长度为1
//考虑将每个数加入上一层的子集
for (int i = 0; i < n; i++) {
//遍历上层子集,子集不会重复,新下标也不会重复,可以在原数组直接修改
for (int j = 0; j <len ; j++) {
dp[1<<i|j]=dp[j]|nums[i];//将这个数的二进制下标加入上层子集下标,得到新下标
}
len*=2;//每次长度*2
}
int max=0;//记录最大值
int ans=0;//记录最大值数量
for (int i = 0; i < dp.length; i++) {
if(dp[i]==max)
ans++;
if(dp[i]>max){
max=dp[i];
ans=1;
}
}
return ans;
}
状压dp算法leetcode.2044
最新推荐文章于 2023-01-18 21:40:30 发布