class Solution {
int[][] memo = null;
public int minimizeMax(int[] nums, int p) {
Arrays.sort(nums);
memo = new int[nums.length+1][p+1];
for(int[] row : memo){
Arrays.fill(row, -1);
}
return dp(0,p, nums);
}
public int dp(int i, int p, int[] nums){
if(p == 0){
return 0;
}
if(i >= nums.length-1){
return (int)1e10;
}
if(memo[i][p] != -1){
return memo[i][p];
}
int with = Math.max(Math.abs(nums[i]-nums[i+1]), dp(i+2, p-1,nums));
int without = dp(i+1, p, nums);
return memo[i][p] = Math.min(with, without);
}
}