diff --git a/leetcode/2171. Removing Minimum Number of Magic Beans/README.md b/leetcode/2171. Removing Minimum Number of Magic Beans/README.md index d57c5821..8bc16f0b 100644 --- a/leetcode/2171. Removing Minimum Number of Magic Beans/README.md +++ b/leetcode/2171. Removing Minimum Number of Magic Beans/README.md @@ -80,7 +80,7 @@ Assume `A = [1,5,10]`. If we pick a number that is not in `A`, say `3`, `A` bec * If we pick `A[3] = 6`, the result array is `[0,0,0,6]`, # of removals is `16 - (4 - 3) * 6 = 10`. ```cpp -// OJ: https://leetcode.com/contest/weekly-contest-280/problems/removing-minimum-number-of-magic-beans/ +// OJ: https://leetcode.com/problems/removing-minimum-number-of-magic-beans/ // Author: github.com/lzl124631x // Time: O(NlogN) // Space: O(1) diff --git a/leetcode/2172. Maximum AND Sum of Array/README.md b/leetcode/2172. Maximum AND Sum of Array/README.md new file mode 100644 index 00000000..5211b371 --- /dev/null +++ b/leetcode/2172. Maximum AND Sum of Array/README.md @@ -0,0 +1,97 @@ +# [2172. Maximum AND Sum of Array (Hard)](https://leetcode.com/problems/maximum-and-sum-of-array/) + +

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.

+ + + +

Return the maximum possible AND sum of nums given numSlots slots.

+ +

 

+

Example 1:

+ +
Input: nums = [1,2,3,4,5,6], numSlots = 3
+Output: 9
+Explanation: One possible placement is [1, 4] into slot 1, [2, 6] into slot 2, and [3, 5] into slot 3. 
+This gives the maximum AND sum of (1 AND 1) + (4 AND 1) + (2 AND 2) + (6 AND 2) + (3 AND 3) + (5 AND 3) = 1 + 0 + 2 + 2 + 3 + 1 = 9.
+
+ +

Example 2:

+ +
Input: nums = [1,3,10,4,7,1], numSlots = 9
+Output: 24
+Explanation: One possible placement is [1, 1] into slot 1, [3] into slot 3, [4] into slot 4, [7] into slot 7, and [10] into slot 9.
+This gives the maximum AND sum of (1 AND 1) + (1 AND 1) + (3 AND 3) + (4 AND 4) + (7 AND 7) + (10 AND 9) = 1 + 1 + 3 + 4 + 7 + 8 = 24.
+Note that slots 2, 5, 6, and 8 are empty which is permitted.
+
+ +

 

+

Constraints:

+ + + + +**Similar Questions**: +* [Minimum XOR Sum of Two Arrays (Hard)](https://leetcode.com/problems/minimum-xor-sum-of-two-arrays/) + +## Solution 1. Bitmask DP + +Append `0`s to make sure the length of `A` is `2 * numSlots`. + +Let `dp[m]` be the maximum score given a bitmask `m` representing the selected numbers. + +Assume `m`'s `i`-th bit is `1`, we have the following formula: + +``` +dp[m] = max( dp[m - (1 << i)] + (slotNumber & A[i]) | m's i-th bit is 1 ) + where slotNumber = (bitCount(m) + 1) / 2 +``` + +The key is that we always assign this picked `A[i]` to `slotNumber`-th slot, and `slotNumber` is a constant given `m`. + +The final answer is the maximum of all `dp` values. + +Example: + +Assume `m = 1101`, we'll assign `A[i]` to slot `(bitCount(m) + 1) / 2 = (3 + 1) / 2 = 2`: +* If `i = 0`, `dp[1101] = dp[1100] + (2 & A[0])` +* If `i = 2`, `dp[1101] = dp[1001] + (2 & A[2])` +* If `i = 3`, `dp[1101] = dp[0101] + (2 & A[3])`. + + +```cpp +// OJ: https://leetcode.com/problems/maximum-and-sum-of-array/ +// Author: github.com/lzl124631x +// Time: O(2^(2*numSlots) * numSlots) +// Space: O(2^(2*numSlots)) +class Solution { +public: + int maximumANDSum(vector& A, int numSlots) { + while (A.size() < 2 * numSlots) A.push_back(0); // append 0s to make sure the length of `A` is `2 * numSlots` + int N = A.size(), ans = 0; + vector dp(1 << N); + for (int m = 1; m < 1 << N; ++m) { + int cnt = __builtin_popcount(m), slot = (cnt + 1) / 2; + for (int i = 0; i < N; ++i) { + if (m >> i & 1) { // we assign A[i] to `slot`-th slot + dp[m] = max(dp[m], dp[m ^ (1 << i)] + (slot & A[i])); + } + } + ans = max(ans, dp[m]); + } + return ans; + } +}; +``` + +## Discuss + +https://leetcode.com/problems/maximum-and-sum-of-array/discuss/1766743 \ No newline at end of file