动态编程 - 任务调度

时间:2013-03-10 19:29:37

标签: dynamic task scheduling lazy-evaluation

这是一个没人能够在"闪光测试中正确回答的问题"在我大学的课堂上:

我们得到了:

int N< 1000个时间段

int [] C:-10 000< = C [i]< = 10 000对应于每个广告位的付款

int T:我们必须使用的插槽数量

问题以下列方式说明:

懒惰工人在整个工作日内有N个时段。

对于每个时段,他都会获得一定的付款(C [i] - 这是不切实际的,也可能是负数)。

他想选择恰好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个插槽,解决方案有效。

1 个答案:

答案 0 :(得分: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 - i} f(i,j-k,t-1)}。如果(j-i + 1

为了从表f中找到解决方案,只需执行max_ {i,j} f(i,j,T)。