假设我有一个包含n个整数的数组。
如何找到大小为k的子集,使得子集中所有整数对之间的最小距离最大化,也就是它们之间的距离最远。
例如:数组a[]={1,2,6,7,10},k=3, 子集={1,6,10},最小距离为10和6之间的4。 错误的子集: {1,7,10},最小距离为3 {1,2,6},最小距离为1
我想出了一个解决方案:
1)对数组进行排序 2)选择a[0],现在在数组中查找ceil(a[0]+x)=Y....然后再查找ceil(Y+x)等等,重复k-1次,第k个元素将是a[n-1]。
为了找到
设
最后我们要找到的是
但是我在寻找
如何找到大小为k的子集,使得子集中所有整数对之间的最小距离最大化,也就是它们之间的距离最远。
例如:数组a[]={1,2,6,7,10},k=3, 子集={1,6,10},最小距离为10和6之间的4。 错误的子集: {1,7,10},最小距离为3 {1,2,6},最小距离为1
我想出了一个解决方案:
1)对数组进行排序 2)选择a[0],现在在数组中查找ceil(a[0]+x)=Y....然后再查找ceil(Y+x)等等,重复k-1次,第k个元素将是a[n-1]。
为了找到
x
:设
dp [i,j]
为从前i个元素中选择j个元素的x
.最后我们要找到的是
dp [n,k]
,它就是x
。但是我在寻找
x
时遇到了问题。
当i = 2至n,j = 2至i时,等式如下:
dp [i,j] = max(min(dp [k,j-1],dp [i] - A [k]))
其中k = 1到i-1。i = 1到n时,等式为:
dp [i,1] = 0
编辑:我想纠正这个动态规划解决方案,尽管我知道可以通过对x进行二进制搜索来找到它。
更新2:我已经更新了代码,但仍然没有得到正确的解决方案。请指出错误。
代码 :http://ideone.com/J5vvR9
更新3: 感谢@Gassa,@Niklas B.和@Fallen的回答!
x
。因为状态将是当前索引(i)、迄今选取的元素数量(j)和迄今为止的最小距离(x)。 - Fallen