这是我想到的一个算法问题,但我自己也无法想到一个简单的解决方案。
这个问题的灵感来自两个着名的问题:最小分段覆盖率和背包问题,描述如下:
给定n
个细分[l_i, r_i]
,所有l_i, r_i in [1,M]
。 n, M
已知。
每个细分都有一个值v_i
,如果您可以选择任意数量的非重叠细分,您可以获得的最大总价值是多少? (感觉还可以)
我有一种强烈的感觉,我的想法过于复杂 但现在我头脑中的解决方案是使用动态编程,就像我们解决背包一样。
r_i
按升序对细分进行排序DP(i) := maximum value we can get using segment [0,i]
,此处索引是步骤1之后的排序索引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)
。现在我的问题是:
答案 0 :(得分:0)
细分覆盖范围可以用名为interval graph的图表来表示。由于您不想采用两个重叠的段,因此您需要在区间图中查找最大加权独立集。这个问题在一般图上是NP难的,但幸运的是它可以很容易地在区间图上求解。如果查看GraphClasses website,您可以看到问题在线性时间内是可解的,即使对于和弦图(它是一个比区间图更大的类),您也可以参考{{3}证明了这一点。