使用动态编程监控具有定义数量的主管的最大价值项目

时间:2013-02-27 20:59:26

标签: algorithm dynamic dynamic-programming

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

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

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

我尝试过使用背包问题,但后来我不知道如何解决覆盖范围的重叠问题 我也尝试使用加权区间调度问题,但它只适用于计算总可能值而不是k区间的最大值。

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

1 个答案:

答案 0 :(得分:1)

对于1&lt; = i&lt; = n且0&lt; = j&lt; = k将DP [i] [j]定义为监督项目的最大值,其中索引在{1..i}时<1可以设置em> j 主管。然后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)