在重叠间隔序列中找到最大和的算法

我试图解决的问题有一个数字列上的间隔,每个都有一个预定义的分数。我需要返回最高可能的总分数。

抓住的是间隔重叠,重叠间隔只能使用一个。这是一个例子。

Intervals   - Score  
   0- 5     -  15  
   4- 9     -  18  
  10-15     -  12  
   8-21     -  19  
  25-30     -  25    

这里,间隔0-5,4-9和8-21重叠。
间隔10-15和8-21也重叠。
最高金额为55(18 12 25)。

重要的是要注意,我们选择第一批重叠间隔的间隔4-9,即使它没有三分之一的最高分。

这是因为选择间隔8-21将阻止我们稍后使用10-15间隔,从而减少总和(在这种情况下,总和将为19 25 = 44)。

我正在寻找一个O(nlogn)或O(n)解决这个问题。我认为动态编程可以使用,但我可能是错的。有人可以建议一个可以在这里做的伎俩的解决方案/算法吗?

编辑:间隔没有特定的顺序。

最佳答案
这是interval scheduling的加权变化;在0(N log N)与dynamic programming可以解决。

让一个间隔g(开始,停止,得分),并让它们按停止排序。为了简单起见,让我们假设所有的停止是唯一的。

当我们被允许使用g [1],…,g [i]时,最好[i]是我们可以获得的最佳得分。我们当然不需要使用它们,通常我们不能因为我们使用的间隔的子集必须是不重叠的。

>显然最好[0] = 0。也就是说,由于我们不能使用任何间隔,我们可以得到的最佳得分是0。
对于任何1≤k≤N,我们有:

> best [k] = max(best [k-1],best [j] g [k] .score),其中

> j是最大的索引,使得g [j] .stop< g [k] .start(j可以为零)
也就是说,考虑到我们被允许使用g [1],… g [k],我们可以做的最好的是这两个选项的得分更好:

>我们不包括g [k]。因此,此选项的得分最好[k-1]。

因为这是我们可以用g [1],… g [k-1]

>我们包括g [k],在左边我们可以对所有不与g [k]重叠的基因进行最好的处理,即所有的g [1],…,g [j] g [j] .stop< g [k] .start和j尽可能的大。因此,该选项的得分最好[j] g [k] .score。
(注意上述方程中体现的动态规划的最优子结构和重叠子问题组成部分)。

问题的总体答案是最好的[N],即当我们被允许使用所有基因时,我们可以得到最好的得分。糟糕,我说基因吗?我的意思是间隔。

这是O(N log N),因为:

>排序所有的间隔取O(N log N)
>为每个k查找j是使用二进制搜索的O(log N)

如果几个基因可以具有相同的停止值,那么没有改变:您仍然必须搜索最右边的j。在例如Python在bisect_right中是很简单的。在Java中,标准库二进制搜索不能保证在绑定时返回哪个索引,您可以(在许多选项中)跟随它进行线性搜索(对于O(N)最坏情况性能)或另一系列二进制搜​​索找到最合适的索引。

哎呀,我再说一遍基因?我的意思是间隔。

相关问题

> Extension of binary search to find the first and last index of the key value

转载注明原文:在重叠间隔序列中找到最大和的算法 - 代码日志