假设我有一个包含n整数的数组。 如何找到大小的子集,以使子集中所有整数对之间k的minimum距离maximized为最远。
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
a[]={1,2,6,7,10}
k=3
subset = {1,6,10}
4
{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
k-1
a[n-1]
要了解x: dp[i,j]是x选择从第i个件J的元素。 最后我们想要的dp[n][k]是x
dp[i,j]
dp[n][k]
但是我在寻找时面临问题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
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常数。
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]))