【问题标题】:find path cross matrix with max sum forward then backward找到最大和向前然后向后的路径交叉矩阵
【发布时间】:2015-12-14 07:59:33
【问题描述】:

如果我有一个矩阵,那么矩阵的每个元素都是一个非负数。我想从左下角穿过矩阵到右上角。在每一步中我只能向上或向右移动,并且每个访问过的元素都将设置为 0;之后,我从右上角走到左下角,每一步都只能向下或向左移动。

我的问题是如何有效地找到最大总和的路径。

【问题讨论】:

  • @kajacx 当我试图找到反例时,似乎当最优路径可以是交叉路径时,我总能找到另一个没有交叉路径的最优路径。
  • 让我为您搜索一下:googlethatforme.pixeleco.com/…
  • @fjardon 你是怎么找到的?你以前遇到过这个问题吗?
  • @fjardon btw 请谷歌搜索另一个问题:我们在二维空间中有一个大小为 N x M 的矩形,这个矩形由 MN 个正方形组成,其中每个正方形的长度为 1。我们画一条直线穿过那个矩形,这条线穿过的最大正方形数是多少? (有人告诉我,最初的问题是在 3-d 空间中。)

标签: algorithm


【解决方案1】:

让我们有一个包含N 行和M 列的矩阵,并假设N>=2M>=2,否则解决方案是微不足道的。我有一个使用动态编程在O(max(M,N) * min(N,M)^4) 中运行的算法。

首先,让我们证明路径不交叉的最优解(开始和结束除外)始终存在。我们将在不降低优化函数的情况下,将任何解转化为非交叉解。

证明:

首先确保第二条路径(从右上角到左下角)始终位于第一条路径的上方或同一行。通过在两条路径中取一个不正确的部分来做到这一点,然后交换它们。插图:

然后,一次移除一个碰撞。您总是可以找到至少一条路线在那里转弯的碰撞,您可以更改该路径以避免碰撞。重复此操作,直到消除所有碰撞。一步的图解:

我们看到,我们不仅没有从两条路径中删除任何元素,而且还添加了更多元素,并且所有元素都是非负数,因此总和只能增加。

算法:

我们只会考虑不交叉的路径,我也会假设N<=M(矩阵的宽度至少与高度一样)。通常我们会从一列中添加数字,这可以使用Prefix sum 快速完成。

我们将从第一列开始。对于每一对 (i,j) 使得 1<=i<j<=N 我们将计算该对的 score,即两条路径从 (1,1) 开始到结束于的总和(1,i) 和 (1,j) 分别。示例:

Matrix:
1 2 3
4 5 6
7 8 9

score(1,1) = 7
score(1,3) = 12
score(2,3) = -inf (paths cannot cross)

然后我们将根据当前列中对的分数计算下一列中每一对的分数。对于下一列中的每一对,只需查看上一列中可以扩展路径以匹配当前列路径的所有对。

最后,你的答案是最后一列中(N-1, N) 对的分数。我很抱歉我在通过书面媒体解释算法方面很糟糕,我希望它不是完全不稳定的。

【讨论】:

  • 您能否解释一下如何为同一个矩阵填充第二列?以及如何检查路径是否相交?这将是非常大的帮助。
猜你喜欢
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多