如何解决这个问题(选择间隔)

时间:2012-10-11 08:35:55

标签: algorithm intervals

我为I = {I(1), I(2), ..., I(m)}提供了一些时间间隔I(i) = [a_i, b_i] (1<=a_i<=b_i<=n)。您可能会认为这些时间间隔相互覆盖(对不起,我的英语很差),因此没有{[1,5], [3,6]}, {[2,5], [5,7]}之类的时间间隔。 {[1,1], [2,2], ..., [n,n]}必须包含在I.

我们假设C(i) = b_i - a_i + 1

我想找到彼此不重叠的{I(c_1), I(c_2), ..., I(c_k)}C(c_1) + C(c_2) + ... + C(c_k) = T. (1 <= T <= n)

我可以使用子集和问题找到O(n*T) DP解决方案,我认为它是NP,但我不确定。我可以优化超过O(n*T)吗?

1 个答案:

答案 0 :(得分:1)

问题可以从Subset Sum problem(给定一组数字和一个目标数,通过一个简单的reduction找出是否存在与该目标相加的子集)中减少:

给定subset-sum的实例:S={c_1,c_2,..,c_n},T - 通过创建n非重叠间隔,间隔i,c_i点来创建此问题的实例(通过提升很容易做到)订购)。同样的T仍然存在。

现在,当且仅当存在总和为T的区间子集时,子集和问题的答案才为真。它基本上是同一个问题,因为所有区间都不会因问题的定义而相互重叠。

由此我们可以得出结论 - 您的问题是NP-Hard

此外,如果我们能够更好地解决问题O(T*n),我们可以使用相同的方法来解决子集求和问题,然后O(T*n) 1,2
然而,AFAIK,子集和的最佳伪多项式解是O(T*n),所以如果你有这样的解决方案 - 坚持下去。


(1)转换问题是O(n)
(2)这种说法仅适用于这种特定的减少,而不适用于多项式减少的一般情况。