class Solution {
public int minXor(int[] nums, int k) {
int[][] memo = new int[nums.length + 1][k + 1];
for (int i = 0; i < nums.length; i++) {
Arrays.fill(memo[i], -1);
}
return tryToPartition(0, k, nums, memo);
}
public int tryToPartition(int index, int remainPartition, int[] nums, int[][] memo) {
if (index == nums.length && remainPartition == 0) {
return 0;
}
if (index == nums.length || remainPartition == 0) {
return Integer.MAX_VALUE;
}
if (memo[index][remainPartition] != -1) {
return memo[index][remainPartition];
}
int curXor = 0;
int maximumXor = curXor;
int answer = Integer.MAX_VALUE;
for (int i = index; i <= nums.length - remainPartition; i++) {
curXor ^= nums[i];
maximumXor = Math.max(
curXor,
tryToPartition(i + 1, remainPartition - 1, nums, memo)
);
answer = Math.min(answer, maximumXor);
}
memo[index][remainPartition] = answer;
return answer;
}
}