我搜索算法,这将有助于我实现一个问题! 问题如下:
有一个范围列表,我需要构建一个包含非重叠范围子集的列表(不一定是相邻的),这样它们的长度总和就是最大可能的。
例如,输入列表
[( - 1,3),(2,4),(0,5),( - 4,-1)]
所需的输出是
[(0,5),( - 4,-1)]
长度之和(5 - 0)+(( - 1) - ( - 4))= 5 + 3 = 8
答案 0 :(得分:2)
这是最大加权独立集问题,权重等于间隔的长度。
这可以使用动态编程来解决。让间隔按开始时间排序。
然后定义DP[I_j]
=最大加权间隔集,以便选择I_j
,并且仅考虑I_j
之前的间隔。这意味着不应考虑与I_j
相交的区间。
DP[I_j] = MAX(DP[I_r]) + Wt(I_j)
其中I_r
是I_j
之前的间隔。
时间复杂度为O(n^2)
,其中n
是间隔数。