2013-03-10 69 views
1

这是一个问题,没有人能在我的大学“闪光测试”在我的课正确回答:动态规划 - 任务调度

我们给出:

INTñ< 1000的时隙

INT [] C:-10 000 < = C [I] < = 10 000支付对应于每个时隙的

INT T:槽数,我们必须使用

问题陈述以下列方式:

懒惰工人具有时间N个时隙中一个总的工作日。

对于每个时间段他得到一定的支付(C [我] - 这不切实际,也可以是负面的)。

他想选择正好T槽的间隔,以便他能得到最大的付款。我们必须选择他将工作的时间间隔。例如[1,4] - 从第一个位置到第四个位置。

问题是,每当他休息一下,当他回来工作时,他的第一个工作岗位将不会被支付,因为他已经习惯了再次工作,就像一个懒惰的人一样。因此,我们也可以选择像[5,5]这样的空白区间,如果我们有负面支付,这可能会派上用场。无论事先支付什么款项,都将获得付款0。

使其更清晰,我要举一个简单的例子:

比方说,我们有N = 5个时隙,我们要选择T = 4。 C = {3,9,1,1,7}

最好的解决方案是间隔[1,2]; [4,5]付款总额为9 + 7 = 16

我们总共覆盖了T = 4个时隙,解决方案是有效的。

回答

0

我在这个问题上的第一次尝试,虽然可能会更快。假设f(i,j,t)表示在子阵列N [i,j](包括i和j)内拟合t点的最佳方式,使得N [i]被覆盖并且N [j]被覆盖。现在注意到,f(i,j,t)= max {f(i,j-1,t-1)+ C [j],max_ {1 < k < j- 1)}。如果(i,j,t)= 0,则基本情况为f(i,j,t)= 0,f(i,j,1)= inf,并且f i,j,2)= C [i] + C [j]。我认为复杂度为O(N^3 * T),因为表f的大小为N^2 * T,而在f内我们需要取最大值(k < j-i)以获得N的额外因子在我们的复杂性。因此O(N^3 * T)。希望我没有忽视问题中的一些事情。

为了找到表f中的解,只需做max_ {i,j} f(i,j,T)。