# [Google] LeetCode 2172 Maximum AND Sum of Array 状态压缩DP

2022-09-06 03:01:16  阅读：47  来源： 互联网

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

``````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);
}
};
``````

2. 关于本站的所有留言、评论、转载及引用，纯属内容发起人的个人观点，与本站观点和立场无关；
3. 关于本站的所有言论和文字，纯属内容发起人的个人观点，与本站观点和立场无关；
4. 本站文章均是网友提供，不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属；如您发现该文章侵犯了您的权益，可联系我们第一时间进行删除；
5. 本站为非盈利性的个人网站，所有内容不会用来进行牟利，也不会利用任何形式的广告来间接获益，纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。