我已经坚持了一段时间的问题。我现在正在算法课程,但这不是一个家庭作业问题。我们还没有在课堂上进行动态编程,我只是自己做这件事。
给定一个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)!.是否有更快(空间或时间)的方法来解决我遇到的问题?
答案 0 :(得分:3)
没有。如果所有成本都是整数,那么在每个单元格中,您需要存储大多数O(M)元素。所以你需要O(MN ^ 2)内存。如果总和> M,则忽略它。
在这个paper中,提到了一种伪多项式算法来解决类似问题(精确成本)。您可以使用相同的算法多次使用精确成本= M..1,也可以阅读算法并找到直接解决问题的变体。
不幸的是,这篇论文是付费的:(