动态编程:网球,储物柜和钥匙

时间:2016-01-19 05:41:15

标签: algorithm dynamic-programming

我无法找到问题的最佳动态规划解决方案,并非常感谢任何帮助。最优解是O(T ^ 2 + M);我只能找到一个O(NM ^ 2)的解决方案。 问题是:

有N个储物柜标有1,2 ...... N.每个储物柜都已锁定,但可以使用它的唯一钥匙打开。每个储物柜钥匙的副本都在其相邻的储物柜内;即,储物柜钥匙i的副本被放置在储物柜i + 1和i-1中(储物柜1的钥匙仅在储物柜2中,储物柜N的钥匙仅在储物柜N-1中)

T网球在T个不同的储物柜内(你知道他们在哪个储物柜里)。您将获得M个储物柜的钥匙,您的目标是通过打开最少数量的储物柜来收集所有网球。

我唯一的暗示是: 提示:你能否有效地判断第i和第j个储物柜之间是否至少有一个网球?

1 个答案:

答案 0 :(得分:1)

首先在 N + 1 处放置一个虚拟牢房,钥匙没有网球。

现在从第二个键开始,继续直到最后一个键(你应该注意,它是一个虚拟键)。

在每次迭代中,针对两种情况计算当前键(包括)左侧网球的最佳解决方案:a。使用当前密钥,和b。当前密钥未使用。最佳解决方案还应记录实际使用的最右键。

如果未使用当前密钥,则使用之前最好的两个解决方案来更新成本,使用实际用于覆盖当前密钥左侧(包括)的球的最右侧密钥。如果使用当前键,则对于当前键(包括端点)左侧的每个球,计算是否支付从该键或先前使用的键打开(它取决于键之间的中点)。 / p>

整体解决方案是虚拟 N + 1 单元格,并且不使用其中的密钥。