【问题标题】:Find non-overlapping ranges with largest total sum of lengths查找总长度总和最大的非重叠范围
【发布时间】:2016-10-18 11:26:34
【问题描述】:

我搜索算法,那将帮助我实现一个问题! 问题如下:

有一个范围列表,我需要使用非重叠范围(不一定相邻)的子集构建一个列表,以使它们的长度之和尽可能大。

例如,对于输入列表

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

想要的输出是

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

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

【问题讨论】:

  • 什么是“最大值”?你想最大化什么价值?
  • 多少钱?示例 [(1,2), (4,6)] 中的“总和”是多少:是 3=[2-1]+[6-4] 还是 5=[6-1]...?
  • 范围的总长度,简而言之。
  • @Treycos 在 this 的情况下,它非常模棱两可,因为间隔有一个共同的末端,所以间隔长度的总和 等于 它们的总跨度.这就是为什么我问另一个例子,有一个洞。
  • @deniska369 好的,所以如果你的意思是 [(1,2), (4,6)] -> [2-1]+[6-4] = 3,那为什么是你的例子结果 [(-1, 3), (-4, -1)] 的总和为 7,而不是 [(0, 5), (-4, -1)] 的总和为 8...?!

标签: algorithm


【解决方案1】:

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

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

然后定义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 是间隔数。

【讨论】:

    猜你喜欢
    • 2018-01-19
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    相关资源
    最近更新 更多