1

我有这个问题,我想解决。我有 n 个项目,每个项目都有一个值 v 放在一行中。然后我有k个监督项,位置x的一个监督项可以监督x-1,x,x+1项。我要计算的是 k 主管可以使用动态编程监督的最大值。

例如。n = {1,2,3,4} v = {7,10,5,8} 这意味着职位 1 -> 17 的主管的总价值(可以覆盖 n = 1 和 2)。
位置 2 -> 22(可以覆盖 n = 1,2,3)。
位置 3 -> 23(可以覆盖 n = 2,3,4)。
位置 4 -> 19(可以覆盖 n = 3,4)。

那么如何计算给定数量的supervisor可以覆盖的最大值呢?
在这个例子中,有 1 个主管,我们得到最大值 23,有 2 个我们得到 36(选择 1 和 4),之后我们不能做得更好,因为所有项目都被覆盖了。

我曾尝试利用背包问题,但后来我陷入了如何解决覆盖重叠的问题。
我也尝试使用加权间隔调度问题,但它仅适用于计算可能的总最大值而不是 k 间隔的最大值。

我非常感谢有关如何使用动态编程解决此问题的任何提示。

4

1 回答 1

1

对于 1 <= i <= n 和 0 <= j <= k 将 DP[i][j] 定义为这些监督项目中的最大值,当j个监督者可以设置时,索引在 {1..i} 中。然后 DP[i + 1][j + 1] = max(A, B, C) 其中

A = DP[i][j + 1] // 这涵盖了最后一个主管在i-1或更早的所有情况

B = DP[i-2][j] + val(i - 1) + val(i) + val(i + 1) // 将主管放在i

C = DP[i - 1][j] + val(i) + val(i + 1) // 将监督者放在i+1

给出 O(n*k)

于 2013-02-27T21:52:33.710 回答