任务定义:
我有一个自然数矩阵。任务是找到从矩阵左上角到矩阵右下角的路径并拨最大分数。导航规则:如果您位于 [i][j],您可以移动:a) 到 [i][j-1]、[i][j+1]、[i+1][j] 单元格和拨零点 b) 到 [i+1][j+1] 和拨矩阵[i][j] 点
小例子:
假设你有score 50
并且matrix
0 3 5 3 2
4 7 2 5 2
4 3 5 2 5
假设您在 [1][1] 单元格中(矩阵 [1][1] = 7)。您可以导航到:
a) [1][0] cell with 50 score
b) [1][2] cell with 50 score
c) [2][1] cell with 50 score
d) [2][2] cell with 57 score
有什么问题:
我以非常缓慢的方式解决了这个任务......
我尝试在递归的帮助下实现。如果您只想找到最高分,这很容易。就像是
public int loop(int i, int j) {
int left = loop(i, j-1);
int top = loop(i-1, j);
int diagonal = loop(i-1,j-1) + matrix[i-1][j-1];
return maximum(left, top, diagonal);
}
但是,我想找到一条得分最高的路径!而且它非常耗时/内存。
为什么它会消耗时间/内存:
还有一个问题:我需要存储路径集合并将其作为参数传递给循环方法。但是循环方法在每次迭代时都会分叉,我必须将路径集合复制一次迭代。否则,每个循环分支都会修改公共路径集合,最后我将拥有所有可能的路径。我的意思是如果在left
, top
&之间,diagonal
最大的是left
我们不能包含用top
and链接的路径diagonal
。
问题:
如何以正确的方式解决它?
编辑:
实际上没有必要找到完整的路径。它只需要找到您拨打分数的点(您在其中进行对角线移动)