我有一个挑战,目标是获得最低成本的路径。 路径可以水平或对角地进行。不垂直。如下。 并且第一行和最后一行也相邻。
例如见下面的矩阵:
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);
如何获取最短路径的行号?
答案 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
。这可能有点棘手,所以如果你不确定我建议你第一次使用完整阵列。