1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| class Solution { public long maximumOr(int[] nums, int k) { this.nums = nums; n = nums.length; dp = new long[n + 1][16]; for (long[] arr : dp) Arrays.fill(arr, -1); preOr = new long[n + 1]; for (int i = 1; i <= n; ++i) preOr[i] = nums[i - 1] | preOr[i - 1]; postOr = new long[n + 1]; for (int i = n - 1; i >= 0; --i) postOr[i] = nums[i] | postOr[i + 1]; return dfs(0, k); } private long dfs(int index, int k) { if (dp[index][k] != -1) return dp[index][k]; if (index == n) return preOr[n]; if (k == 0) { int pre = -1; long temp1 = 0, temp2; for (int i : change.keySet()) { temp2 = preOr[i] | preOr[pre + 1]; temp2 = temp2 | ((long) nums[i] << change.get(i)); temp1 |= temp2; pre = i; } temp2 = postOr[pre + 1]; temp1 |= temp2; return temp1; } long res, changeNext = 0; long pass = dfs(index + 1, k); if (k > 0) { change.put(index, change.getOrDefault(index, 0) + 1); changeNext = dfs(index, k - 1); change.put(index, change.get(index) - 1); if (change.get(index) == 0) change.remove(index); } res = Math.max(pass, changeNext); return dp[index][k] = res; }
int[] nums; long[] preOr, postOr; int n; TreeMap<Integer, Integer> change = new TreeMap<>(); long[][] dp; }
|