小编典典

查找大小为k的子集,以使值之间的最小距离最大

algorithm

假设我有一个包含n整数的数组。
如何找到大小的子集,以使子集中所有整数对之间kminimum距离maximized为最远。

例如:数组a[]={1,2,6,7,10}k=3
subset = {1,6,10}最小距离4在10到6之间。
错误的子集
{1,7,10},最小距离为3
{1,2,6},最小距离为1

我想出了一个解决方案:

1)对数组进行排序
2)选择a [0],现在x在数组....中找到ceil(a [0] + )= Y,然后找到ceil(Y +
x)等等k-1,第k个元素将是a[n-1]

要了解x
dp[i,j]x选择从第i个件J的元素。
最后我们想要的dp[n][k]x

但是我在寻找时面临问题x

dp [i,j] = max(min(dp [k,j-1],dp [i] -A [k]))
在k = 1到i-1,i = 2到n,j = 2到一世

dp [i] [1] = 0,i = 1到n

编辑 :我想纠正 动态编程 解决方案,尽管我知道x可以通过对x进行二进制搜索找到。

更新2 :我已经更新了代码,但仍然没有获得正确的解决方案。请指出错误。
代码:http//ideone.com/J5vvR9

更新3 :感谢@Gassa,@Niklas B.和@Fallen的回答!


阅读 272

收藏
2020-07-28

共1个答案

小编典典

基数应为:

dp[i][1] = INFINITY for i = 1 to n

原因是空集的最小值是正无穷大。

在实践中,任何整数大于最大的可能更大a[i] - a[j]一些i并且j将足以作为INFINITY常数。

此外,正确的过渡将是:

dp[i,j] = max{for k=1 to i-1} (min(dp[k,j-1], a[i]-a[k]))
2020-07-28