You are given an integer array nums of length n
and an integer numSlots
such that 2 * numSlots >= n
. There are numSlots
slots numbered from 1
to numSlots.
You have to place all n
integers into the slots such that each slot contains at most two numbers. The AND
sum of a given placement is the sum of the bitwise AND
of every number with its respective slot number.
For example, the AND sum of placing the numbers [1, 3]
into slot 1
and [4, 6]
into slot 2
is equal to (1 AND 1) + (3 AND 1) + (4 AND 2) + (6 AND 2) = 1 + 1 + 0 + 2 = 4
.
Return the maximum possible AND sum of nums given numSlots slots.
Solution
数据范围很小,这就暗示了这题使用状态压缩。我们用二进制数来表示这些 \(slot\) 的使用情况,如果 \(i\) 位置为 \(1\),说明还未被使用。接着对于每一个 \(num[i]\) 我们枚举每个 \(slot\)。
点击查看代码
class Solution {
private:
vector<vector<int>> dp;
int dfs(int ft, int se, vector<int>& nums, int idx, int& numSlots){
if(idx==nums.size()) return 0;
if(dp[ft][se]!=-1) return dp[ft][se];
int res=0;
int ans=0;
for(int i=0;i<numSlots;i++){
int curslot = 1<<i;
if(se&curslot){
res = (i+1)&nums[idx];
if(ft&curslot)res+=dfs(ft^curslot,se,nums,idx+1,numSlots);
else{res+=dfs(ft,se^curslot, nums,idx+1,numSlots);}
}
ans=max(ans,res);
}
return dp[ft][se]=ans;
}
public:
int maximumANDSum(vector<int>& nums, int numSlots) {
int state = (1<<numSlots) - 1;
dp.resize(state+1,vector<int>(state+1,-1));
int state2 = state;
return dfs(state, state2, nums, 0, numSlots);
}
};