【问题标题】:Finding a path through a checkerboard which is closest to a given cost通过棋盘寻找最接近给定成本的路径
【发布时间】:2015-02-03 14:09:59
【问题描述】:

我被一个问题困住了一段时间。我现在正在学习算法课程,但这不是家庭作业问题。我们还没有在课堂上学习动态编程,我只是在自己做这件事。

给定一个 NxN 大小的棋盘,其中每个坐标都有一个成本和另一个整数 M,求从棋盘左上角到棋盘右下角的路径的成本(只允许向右或向下移动 1 格)使得路径的总成本低于 M,但尽可能接近 M。 NxN 和 M 的所有元素都是正数。

如果这要求我找到最小或最大路径,我可以使用标准动态规划算法,但由于我受到 M 的限制,我认为我必须使用另一种策略。我一直在尝试使用 memoization 并构建一个数组,其中填充了一组从开始到给定元素的所有可能路径的成本。为了构造 (i, j) 的集合,我将 (i, j) 的成本值添加到 (i-1, j) 和 (j-1, i) 的集合并集中的每个元素(如果它们存在,否则只需使用集合 {0} 代替)。一旦我为棋盘中的所有元素完成了此操作,选择正确的路径就很简单了。只需在 (N, N) 的集合中选择低于 M 但最接近 M 的元素。

例如:

+---+---+---+
| 0 | 1 | 3 |
| 3 | 2 | 1 |
| 5 | 2 | 1 |
+---+---+---+

到给定点的路径成本:

+---+----------+----------------+
| 0 | 1        | 4              |
| 3 | 3, 5     | 4, 5, 6        |
| 8 | 5, 7, 10 | 5, 6, 7, 8, 11 |
+---+----------+----------------+

这是一种空间效率极低的做事方式。如果我做对了,那么 (N, N) 节点集合中元素数量的最坏情况是 (N+1)!/((N+1)/2)!。有没有更快(空间或时间)的方法来解决我缺少的这个问题?

【问题讨论】:

  • 成本可以为负数吗?
  • 没有。网格和 M 中的所有成本都是正数。通过网格的路径的最小成本可能大于 M(在这种情况下,答案是没有路径)。

标签: algorithm dynamic-programming


【解决方案1】:

没有。如果所有成本都是整数,则在每个单元格中您最多需要存储 O(M) 个元素。所以你需要 O(MN^2) 内存。如果总和为 >M,则忽略它。

在这个paper 中提到了一个伪多项式算法来解决类似的问题(精确成本)。您可以以精确成本 = M..1 多次使用相同的算法,也可以阅读算法并找到直接解决您问题的变体。

不幸的是,纸是付费的:(

【讨论】:

  • 当成本为正时确实如此,OP 证实了这一点。
猜你喜欢
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
相关资源
最近更新 更多