如果我有一个矩阵,矩阵的每个元素都是非负数。我想从左下角走到右上角。在每一步中,我只能向上或向右移动,并且每访问一个元素后都将其设置为0;之后,我从右上角向左下角走,每一步中,我只能向下或向左移动。
我的问题是如何高效地找到具有最大和的路径。
我的问题是如何高效地找到具有最大和的路径。
然后,一次只删除一个碰撞。您总是可以找到至少有一条路径在那里转弯的碰撞,并更改该路径以避免碰撞。重复此过程,直到所有碰撞都被移除。下面是一步的示例:
我们可以看到,不仅两条路径合并后没有删除任何元素,而且还添加了更多的元素,并且所有元素都是非负的,因此总和只能增加。 算法: 我们将只考虑不交叉的路径,同时假设N<=M
(矩阵宽度至少与高度相同)。通常,我们会添加一列中的数字,这可以使用前缀和快速完成。1<=i<j<=N
,我们将计算该对的分数,即两条路径从(1,1)开始分别覆盖(1,i)和(1,j)的总和。例如:Matrix:
1 2 3
4 5 6
7 8 9
score(1,1) = 7
score(1,3) = 12
score(2,3) = -inf (paths cannot cross)