【问题标题】:Maximum weighted segment coverage algorithm最大加权段覆盖算法
【发布时间】:2017-06-16 04:38:55
【问题描述】:

这是我自己想到的算法问题,但我自己想不出一个简单的解决方案。

这个问题的灵感来自于合并两个著名的问题:Minimum segment coverage & Knapsack problem,描述如下:

给定n[l_i, r_i],其中所有l_i, r_i in [1,M]n, M 是已知的。

每个段都有一个值v_i,如果您可以选择任意数量的非重叠段,您可以获得的最大总价值是多少? (触摸没问题)


我有一种强烈的感觉,我的想法过于复杂 但现在我脑海中的解决方案是使用动态编程,就像我们解决背包一样。

  1. r_i升序对段进行排序
  2. 定义DP(i) := maximum value we can get using segment [0,i],这里的索引是第1步之后的排序索引
  3. DP(i) = max(DP(j) + v[i], DP(i-1))j is the largest index where r_j <= l_i, which can be found using binary search

我认为这个解决方案是O(N lg N)。现在我的问题是:

  1. 这个解决方案正确吗?
  2. 有没有更简单、性能更好的解决方案?

【问题讨论】:

  • 这个叫“加权间隔调度”,google一下。
  • 哇,谢谢伙计,正是我要找的……而且确实很经典。简而言之,似乎 O(N lg N) 是我能做到的最好的......

标签: algorithm dynamic-programming


【解决方案1】:

段覆盖率可以用一个名为interval graph 的图表来表示。由于您不想采用两个重叠的段,因此您正在寻找在区间图中找到最大加权独立集。这个问题在一般图上是 NP-hard,但幸运的是,它可以在区间图上轻松解决。如果您查看GraphClasses website,您会发现该问题可以在线性时间内解决,即使对于弦图(它是比区间图更大的类),您可以参考original paper 来证明这一点.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 2011-04-21
    相关资源
    最近更新 更多