【问题标题】:How to find Path of Lowest Cost in 2D matrix如何在二维矩阵中找到成本最低的路径
【发布时间】:2016-12-05 12:58:40
【问题描述】:

我有一个挑战,目标是获得最低的路径成本。 该路径可以水平或对角线进行。不是垂直的。如下所示。 而且第一行和最后一行也是相邻的。

例如见下面的矩阵:

output for 1st matrix :
16
1 2 3 4 4 5-->path row number

output for second matrix:
11
1 2 1 5 4 5-->path row number

我在 java 中做这件事,我得到的是最低路径,但没有得到使用行号打印路径的路径。

int minCost(int cost[r][r], int m, int n)
{
   if (n < 0 || m < 0)
      return Integer.MAX_VALUE;;
   else if ((m == r-1 && n == c-1)|| n+1>=c)
      return cost[m][n];
   else
      return cost[m][n] + min( minCost(cost, m+1>=r?r-1:m+1,n+1),
                                         minCost(cost, m,n+1),
                                minCost(cost, m-1>=0?m-1:r-1,n+1));
    }
// calling it 
minCost(cost, 0, 0);

如何获取最短路径的行号?

【问题讨论】:

  • 此算法在O(3^r) 中运行。更有效的方法是逐列遍历矩阵并从前一列计算下一列的列成本。或者使用动态编程。这两种方法都可以在O(min(c, r) * c) 中运行。
  • 如果您不友好,请您解释一下

标签: java arrays algorithm shortest-path


【解决方案1】:

我将尝试扩展 fabian 的评论:

很明显,如果使用相同的参数调用您的 minCost 函数,它将返回相同的值。在您的算法中,它确实会以相同的值被调用很多次。对第 0 列的每次调用都会为第 1 列生成 3 次调用,这反过来又会为第 2 列生成 9 次调用,依此类推。最后一列将获得大量调用(fabian 指出的 3^r),其中大多数会重新计算非常其他调用的值相同。

我们的想法是存储这些值,这样就不需要在每次需要时重新计算它们。一个非常简单的方法是创建一个与原始矩阵大小相同的新矩阵,并逐列计算到达每个单元格的最小总和。第一列将是微不足道的(只需从原始数组中复制,因为只涉及一个步骤),然后继续使用已计算的值来处理其他列。

之后,您可以通过仅将第二个矩阵替换为两列来优化空间使用,因为一旦您完全计算了列 n,您将不需要列 n-1。这可能有点棘手,所以如果你不确定我建议第一次使用完整的数组。

【讨论】:

    【解决方案2】:

    你的算法效率很低。我能想到的最好的解决方案是向后计算(从右到左)。考虑第二个矩阵的右 2 列:

    8 6
    7 4
    9 5
    2 6 
    2 3
    

    如果现在我们在值为 8 的单元格上,下一步可能是 6/4/3。当然我们选择 3 是因为我们想要更小的成本。如果现在我们在值为 7 的单元格上,下一步可以是 6/4/5,我们将选择 4。这样两列可以合并为一列:

    11   //8+3
    11   //7+4
    13   //9+4
    5    //2+3
    5    //2+3
    

    现在重复最后两列:

    2  11
    2  11
    9  13
    3  5
    1  5
    

    最后将矩阵合并为一列,列中的最小值成本最低。

    【讨论】:

      猜你喜欢
      • 2020-08-17
      • 2016-07-20
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 2014-08-31
      • 1970-01-01
      相关资源
      最近更新 更多