【发布时间】: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