在棋盘上寻找一条路径,使其成本最接近给定值

3

我已经被一个问题卡住了一段时间。我现在正在上算法课,但这不是一道作业题。我们还没有在课堂上学习动态规划,我只是自己做这个题。

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

如果让我找到最小或最大路径,我可以使用标准的动态规划算法,但由于我的限制是M,我认为我必须使用另一种策略。我一直在尝试使用记忆化,并构建一个数组,其中填充了从起点到给定元素的所有可能路径的成本集合。对于(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)!。我是否忽略了解决此问题的更快速(时间或空间)方法?


成本可以是负数吗? - didierc
网格中的所有成本和M都是正数。路径的最小成本可能大于M(在这种情况下,答案是没有路径)。 - Daniel Ong
1个回答

3
不行。如果所有成本都是整数,每个单元格最多需要存储O(M)个元素。因此,您需要O(MN ^ 2)内存。如果总和> M,则只需忽略它。
在这篇论文中提到了一种伪多项式算法来解决类似问题(精确成本)。您可以使用相同的算法多次,精确成本= M..1,或者阅读算法并找到直接解决您问题的变体。
不幸的是,该论文需要付费才能访问:(

当成本为正数时,这是确实的,OP已经确认了。 - didierc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接