有一个数组,严格按照从0到999的顺序包含数字。
例如:
int[] array = {0, 24, 55, 124, 200, 259, 400, 503, 666, 797};
我需要做的是实现一个函数,它选择N个数字,以便这些选定数字之间的最小距离值最大化。
例如,如果N为3,则选定的数字为0、400和797,间隔分别为400和397;因此返回值为397(应该最大化)。如果我们选择其他数字集合,则返回值将小于(或等于)397。
我想使用递归来实现它,但我很难编写代码。你能帮我吗?
有一个数组,严格按照从0到999的顺序包含数字。
例如:
int[] array = {0, 24, 55, 124, 200, 259, 400, 503, 666, 797};
s[c][p]
为选择c
个数字且在输入数组中最后选择的数字的索引为p
时的解决方案。s[c][p]
为max for i=0..p of max(s[c-1][p-i], array[p] - array[p-i])
在开始时,以下状态:s[1][0..n]
,其中n
是输入数组的长度,应该具有值0
。s[1][0..n]
,我们现在可以轻松地计算s[2][0..n]
,使用给定的公式。s[2][0..n]
,我们现在可以轻松地计算s[3][0..n]
。max s[N][N-1..n]
,其中n
是输入数组的长度,N
是要选择的数字数量。O(N*n^2)
。s[0..N][0..n]
的值,每次计算的时间复杂度为O(n)
。O(n)
。s[c][0..n]
,您只需要s[c-1][0..n]
,因此在任何时刻实际上只需要2*n
的内存。