9
int h[12]; // h[i] == 3^i10
int search(int start, int mask) {11
if (start == n) return 0;12
if (dp[start][mask] != -1) return dp[start][mask];13
// try to push a[start] into slot 1 ~ k14
for (int i = 1; i <= k; i++) {15
int cnt = (mask % h[i + 1]) / h[i];17
dp[start][mask] = max(dp[start][mask], (a[start] & i) + search(start + 1, mask + h[i]));20
return dp[start][mask];24
int maximumANDSum(vector<int> &nums, int numSlots) {25
// states: at most 3^k27
a.assign(nums.begin(), nums.end());28
memset(dp, -1, sizeof(dp));29
// dp[i][mask]: the answer for nums[i:] with mask (based-3)30
// a 3^1 + b 3^2 + c 3^3 + ...35
for (int i = 1; i < 12; i++) h[i] = h[i - 1] * 3;