using System;
class GfG {
// returns the maximum achievable minimum
// absolute difference
static int helper(int i, int remk, int prev,
int[] arr, int k,
int[,,] memo) {
// no more comparisons needed, neutral value
if (remk == k)
return int.MaxValue;
// invalid, ran out of elements
if (i == arr.Length)
return -1;
if (memo[i, remk, prev + 1] != -2)
return memo[i, remk, prev + 1];
// skip current element
int skip = helper(i + 1, remk, prev, arr, k, memo);
// take current element
int diff = (prev == -1) ?
int.MaxValue : Math.Abs(arr[i] - arr[prev]);
int next = helper(i + 1, remk + 1, i, arr, k, memo);
int take = (next == -1) ? -1 : Math.Min(diff, next);
// store and return the max of both choices
return memo[i, remk, prev + 1] = Math.Max(skip, take);
}
static int maxMinDiff(int[] arr, int k) {
Array.Sort(arr);
int n = arr.Length;
// initialize 3D memo with -2 (uncomputed)
int[,,] memo = new int[n + 1, k + 1, n + 1];
for (int i = 0; i <= n; i++)
for (int j = 0; j <= k; j++)
for (int l = 0; l <= n; l++)
memo[i, j, l] = -2;
return helper(0, 0, -1, arr, k, memo);
}
public static void Main() {
int[] arr = {1, 4, 9, 0, 2, 13, 3};
int k = 4;
Console.WriteLine(maxMinDiff(arr, k));
}
}