找到具有最大总长度的非重叠范围

时间:2016-10-18 11:26:35

标签: algorithm

我搜索算法,这将有助于我实现一个问题! 问题如下:

有一个范围列表,我需要构建一个包含非重叠范围子集的列表(不一定是相邻的),这样它们的长度总和就是最大可能的。

例如,输入列表

  

[( - 1,3),(2,4),(0,5),( - 4,-1)]

所需的输出是

  

[(0,5),( - 4,-1)]

长度之和(5 - 0)+(( - 1) - ( - 4))= 5 + 3 = 8

1 个答案:

答案 0 :(得分:2)

这是最大加权独立集问题,权重等于间隔的长度。

这可以使用动态编程来解决。让间隔按开始时间排序。

然后定义DP[I_j] =最大加权间隔集,以便选择I_j,并且仅考虑I_j之前的间隔。这意味着不应考虑与I_j相交的区间。

DP[I_j] = MAX(DP[I_r]) + Wt(I_j)

其中I_rI_j之前的间隔。

时间复杂度为O(n^2),其中n是间隔数。