查找大小为k的子集,以使值之间的最小距离最大
问题内容:
假设我有一个包含n
整数的数组。
如何找到大小的子集,以使子集中所有整数对之间k
的minimum
距离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的回答!
问题答案:
基数应为:
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]))