我为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)
吗?
答案 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)这种说法仅适用于这种特定的减少,而不适用于多项式减少的一般情况。