Arrays 选择数字以最大化间隔
存在一个数组,该数组包含严格按递增顺序排列的从0到999的数字 比如说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 我想用递归实现它,但我很难对它进行编码。你愿意帮我吗?这
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次回答:这是双关语吗?)