有一个数组包含一个0到999之间的数字,严格按顺序递增.
例如
int[] array = {0, 24, 55, 124, 200, 259, 400, 503, 666, 797};
我要做的是实现一个选择N个数字的函数,以便最大化这些选中数字之间的距离的最小值.
例如,如果N是3,则拾取的数字是0,400,797,间隔是400和397;所以返回值是397(应该最大化).如果我们选择其他数字集,则返回值将小于(或等于)397.
我想用递归来实现它,但我很难编写它.你想帮助我吗?
最佳答案 使用
dynamic programing可以解决此问题.
如果我们在选择c数时将s [c] [p]定义为解决方案,并且最后选择的数字在输入数组中具有索引p.
然后,我们可以将s [c] [p]计算为max,其中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的内存.
编辑:您可以使用递归来实现所描述的算法,使用称为memoization的编程技术(https://en.wikipedia.org/wiki/Memoization).