【发布时间】: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,如果您可以选择任意数量的非重叠段,您可以获得的最大总价值是多少? (触摸没问题)
我有一种强烈的感觉,我的想法过于复杂 但现在我脑海中的解决方案是使用动态编程,就像我们解决背包一样。
- 按
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)。现在我的问题是:
- 这个解决方案正确吗?
- 有没有更简单、性能更好的解决方案?
【问题讨论】:
-
这个叫“加权间隔调度”,google一下。
-
哇,谢谢伙计,正是我要找的……而且确实很经典。简而言之,似乎 O(N lg N) 是我能做到的最好的......
标签: algorithm dynamic-programming