【问题标题】:Unable to figure out why a DP approach won't work无法弄清楚为什么 DP 方法不起作用
【发布时间】:2017-05-02 07:54:49
【问题描述】:

我正在尝试学习动态编程技术。我正在看这个教程 - https://www.topcoder.com/community/data-science/data-science-tutorials/dynamic-programming-from-novice-to-advanced/

请阅读Advanced部分中问题StarAdventure的问题说明。

我不明白为什么我们不能只使用经典的 DP 方法从左上角到右下角找到最佳路径三次删除最佳路径中找到的苹果。有人可以使用示例案例解释为什么这种方法不起作用。

问题描述:

给定一个具有 M 行和 N 列 (N x M) 的矩阵。每个牢房里都有许多苹果。 您从矩阵的左上角开始。您可以向下或向右移动一个单元格。您需要到达右下角。然后,您需要通过每一步向左或向上移动一个单元格来返回左上角单元格。到达左上角的单元格后,您需要再次返回右下角的单元格。 找出您可以收集的最大苹果数。 当你穿过一个牢房时——你会收集那里剩下的所有苹果。

限制:

1 N, M

【问题讨论】:

  • DP 在这里是合适的,链接的教程似乎暗示了这一点。是什么让您认为它不起作用?
  • 你能把同样的苹果收集两次吗?还是在您访问它们后细胞已耗尽?问题陈述没有这么明确地说,但我想作者的意图是后者。否则,如您所说,三步走最大值将只是单步最大值的三倍。

标签: algorithm dynamic-programming


【解决方案1】:

您的算法可能会做出错误的决定,因为从一开始就没有考虑到您将有其他机会获得丰厚的奖励,从而降低您的总数。

例子:

S 0 0 50 1
1 1 1 0 1
1 1 1 0 1
1 1 1 50 1
1 1 1 50 E

你的算法会是 S-0-0-50-0-0-50-50-E,然后是 E-50(0)-1-1-1-1-1-1-S,然后是 S- 0-1-1-1-1-50(0)-1-E。一共获得 0 个苹果 7 次(总奖励 3*50+7*0+11*1=161)。

你可以这样做得更好:S-0-0-50-1-1-1-1-E,然后是 E-50-1-1-1-1-1-1-S,然后是 S- 0-1-1-1-1-50-1(0)-E,总共给你 3*150+4*0+14*1=164 个苹果。

所以你可以使用 DP,但不能像这样从 S 到 E 一次,然后一次 E-S,然后再 S-E。您必须立即考虑完整的路径。

【讨论】:

  • 感谢您的解决方案。我对提到的算法进行了编码。我得到的复杂性是 m*n^3 。这种复杂性是否正确。
  • 是的,我认为是
猜你喜欢
  • 2021-05-29
  • 1970-01-01
  • 2014-12-08
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多