Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 选择数字以最大化间隔_Arrays_Algorithm_Dynamic Programming - Fatal编程技术网

Arrays 选择数字以最大化间隔

Arrays 选择数字以最大化间隔,arrays,algorithm,dynamic-programming,Arrays,Algorithm,Dynamic Programming,存在一个数组,该数组包含严格按递增顺序排列的从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};
我要做的是实现一个函数,选取N个数字,使这些选取的数字之间的距离的最小值最大化

例如,如果N为3,则拾取的数字为0、400、797,间隔为400和397;所以返回值是397(应该最大化)。如果我们选择其他数字集,那么返回值将小于(或等于)397


我想用递归实现它,但我很难对它进行编码。你愿意帮我吗?

这个问题可以用

如果我们将
s[c][p]
定义为拾取
c
数字时的解决方案,并且最后选择的数字在输入数组中具有索引
p

然后,我们可以将
s[c][p]
计算为i=0的
max..p的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()的编程技术。

对$n$的限制是什么?你期望有多复杂?你尝试了什么?这个问题已经解决了。查看以下线程如果N为3,则必须选择第一个元素,最后一个元素和最接近中间点的元素,这是一个二进制搜索,因此它是O(log(N)。对于更高的N,可能会有类似的情况。(请改进标题)
您想帮我吗?
如果您展示了您尝试的内容,一些人可能会更倾向于此(这里:你的想法是什么,你还没有成功地编码)。
我想用递归来实现它
那么基本情况是什么,你如何将一个大问题实例简化为小问题实例,以及你如何将大问题实例的解组合成“小问题解决方案”?(我没有得到第23次回答:这是双关语吗?)