如何在二维矩阵中找到最低成本路径

时间:2016-07-31 08:09:45

标签: java arrays algorithm shortest-path

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

enter image description here

例如见下面的矩阵:

enter image description here

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);

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

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

我将尝试扩展法比安的评论:

很明显,如果使用相同的参数调用,您的minCost函数将返回相同的值。在你的算法中,确实会使用相同的值多次调用它。每次调用第0列都会为第1列生成3次调用,而第1列会为第2列生成9次调用,最后一列将获得大量调用(3 ^ r为fabian指向),其中大多数都重新计算其他电话的价值相同。

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

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