Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在二维矩阵中找到成本最低的路径_Java_Arrays_Algorithm_Shortest Path - Fatal编程技术网

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

Java 如何在二维矩阵中找到成本最低的路径,java,arrays,algorithm,shortest-path,Java,Arrays,Algorithm,Shortest Path,我有一个挑战,目标是获得路径的最低成本。 路径可以水平或对角进行。不是垂直的。如下图所示。 第一行和最后一行也是相邻的 例如,见以下矩阵: 我是用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

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

例如,见以下矩阵:

我是用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);
intmincost(intcost[r][r],intm,intn)
{
if(n<0 | | m<0)
返回整数.MAX_值;;
else如果((m==r-1&&n==c-1)|n+1>=c)
退货成本[m][n];
其他的
退货成本[m][n]+min(最小成本(成本,m+1>=r?r-1:m+1,n+1),
最小成本(成本,m,n+1),
最小成本(成本,m-1>=0?m-1:r-1,n+1);
}
//叫它
最小成本(成本,0,0);

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

我将尝试扩展fabian的评论:

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

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


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

我将尝试扩展fabian的评论:

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

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


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

您的算法效率很低。我能想到的最好的解决方案是向后计算(从右到左)。考虑你的第二个矩阵的右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

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

您的算法效率很低。我能想到的最好的解决方案是向后计算(从右到左)。考虑你的第二个矩阵的右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

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

此算法在
O(3^r)
中运行。更有效的方法是逐列迭代矩阵,并从上一列计算下一列的列成本。或者使用动态规划。这两种方法都可以在
O(min(c,r)*c)
中运行。如果您不愿意,请您进一步解释此算法在
O(3^r)
中运行。更有效的方法是逐列迭代矩阵,并从上一列计算下一列的列成本。或者使用动态规划。这两种方法都可以在
O(min(c,r)*c)
中运行。如果您不喜欢,请您进一步解释