我有一个问题与查找最长非重叠序列的算法非常相似。
与链接问题的唯一区别是,我不需要找到代表最长序列的非重叠元组集,而是需要找到代表最大覆盖率的非重叠元组集,我的意思是总和元组长度最大(元组长度在下一句中last - first + 1
给出元组的定义)。
我表示我的元组与链接问题不同。而不是(starting index, length)
,我将我的元组表示为(first, last)
; 例如,元组(3,7)
表示数字的集合[3, 4, 5, 6, 7]
。(即使端点匹配,一个元组也会与另一个元组重叠;即重叠(2,6)
,因此不能同时出现在解决方案中。)(6,8)
例如,考虑以下一组元组,按 排序first
:
[(0,100), (2,50), (30,150), (60,95), (110,190), (120,150), (191,200)]
此处的最大值将[(0,100), (110,190), (191,200)]
覆盖101 + 81 + 10 = 192
. (请注意,此解决方案中的元组是不重叠的。)
解决此问题的最简单算法的示例是什么,该算法的复杂性是多少?(如果这个问题可以解决就好了O(N)
,但我目前不知道是否可以。)
附录:回想起来,事实证明我在这里提出的问题等同于加权间隔调度问题。这是间隔调度问题的一个特例。
@j_random_hacker 下面的答案实际上是加权间隔调度问题的已知解决方案,其时间复杂度为O(N log(N))
.