最大加权段覆盖算法

时间:2017-06-16 04:38:56

标签: algorithm dynamic-programming

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

这个问题的灵感来自两个着名的问题:最小分段覆盖率和背包问题,描述如下:

给定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
  4. 我认为此解决方案属于O(N lg N)。现在我的问题是:

    1. 此解决方案是否正确?
    2. 是否有更简单,性能更好的解决方案?

1 个答案:

答案 0 :(得分:0)

细分覆盖范围可以用名为interval graph的图表来表示。由于您不想采用两个重叠的段,因此您需要在区间图中查找最大加权独立集。这个问题在一般图上是NP难的,但幸运的是它可以很容易地在区间图上求解。如果查看GraphClasses website,您可以看到问题在线性时间内是可解的,即使对于和弦图(它是一个比区间图更大的类),您也可以参考{{3}证明了这一点。