无法理解动态编程

时间:2016-03-26 01:15:41

标签: algorithm dynamic-programming

我昨晚有关于动态编程的任务,但我不得不将其转为未完成,因为我无法理解如何解决最后一个问题:

  

该州希望监控长达n英里的高速公路上的交通。在高速公路的英里i上安装监控设备需要花费c i 。监控设备之间的最大距离不应超过d英里。也就是说,如果在英里i上存在监视设备,则必须有一个监视设备从英里i + 1到英里i + d(或者是i + d> n的情况)。国家想要一个能够最大限度降低成本的计划。假设有一个数组C [1..n]的成本。

     

设v k 是假设k英里高速公路并且在k英里假设监控设备的最佳解决方案的成本。给定C和d,如果已知v 1 到v k-1 的值,则显示如何确定v k 的值。您可以用数学方式编写它,或者以书的风格提供伪代码。请注意,您需要考虑k的所有可能值,从k = 1到k = n。

我确定会在考试中出现与此类似的问题,我想至少知道从哪里开始解决这个问题,所以我们非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

我们将DP [i]定义为在i站安装监视器的最低成本以及一些小于i的其他索引(使得每个连续站小于或等于距离d)

现在问题的答案是

min(DP [n - d + 1],... DP [n - 2],DP [n - 1],DP [n])

这是在最后d个索引上使用最后一个监视器的最低成本。

现在,动态编程的递归关系可以很容易地看作:

DP [i] = min(DP [i - 1],DP [i - 2],... DP [i - d])+ C [i] 如果我们想在第i个索引上安装一个监视器,我们按成本C [i]安装它,我们还必须确保在以前的d索引中有一个监视器。因此,我们至少在其前面的d索引上安装第二个最后一个监视器。

如果您通过naive方法对重复进行编码,它看起来是O(n * d),但是通过使用双端队列的滑动窗口最小算法,您可以将时间复杂度降低到渐近O(n)。

由于这是一个作业问题,我不会详细写作。你应该能够从这一点开始跟进。