📅  最后修改于: 2023-12-03 15:36:19.609000             🧑  作者: Mango
给定一个大小为 $m \times n$ 的非负整数矩阵,找出一条从左上角到右下角的路径,使得路径上所有点的数值之和最大,并返回该路径上的最大点。
我们可以使用动态规划来解决这个问题。我们令 $f(i,j)$ 表示从矩阵左上角到点 $(i,j)$ 的最大值。假设现在我们已经求出了 $f(i-1,j)$ 和 $f(i,j-1)$,接下来我们需要求出 $f(i,j)$。由于每个格子只能从上方或者左方的格子到达,因此 $f(i,j)$ 的值可以通过 $f(i-1,j)$ 和 $f(i,j-1)$ 推算得到:
$$f(i,j) = \max{f(i-1,j), f(i,j-1)}+a_{ij}$$
其中 $a_{ij}$ 表示矩阵中第 $i$ 行第 $j$ 列的数值。
最后,$f(m,n)$ 就是从矩阵左上角到右下角的最大值。我们还可以通过记录每个点是从哪个方向到达的来还原出最大路径。
下面是一份 Python 代码的例子:
def getMax(matrix):
m, n = len(matrix), len(matrix[0])
f = [[0]*n for _ in range(m)]
path = [[0]*n for _ in range(m)]
for i in range(m):
for j in range(n):
if i == 0 and j == 0:
f[0][0] = matrix[0][0]
elif i == 0:
f[i][j] = f[i][j-1] + matrix[i][j]
path[i][j] = "left"
elif j == 0:
f[i][j] = f[i-1][j] + matrix[i][j]
path[i][j] = "up"
else:
if f[i-1][j] > f[i][j-1]:
f[i][j] = f[i-1][j] + matrix[i][j]
path[i][j] = "up"
else:
f[i][j] = f[i][j-1] + matrix[i][j]
path[i][j] = "left"
return f[m-1][n-1], path
# 示例
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
maxVal, maxPath = getMax(matrix)
print("最大值:", maxVal)
print("最大路径:", maxPath)
我们使用上面的例子来运行这份代码:
最大值: 21
最大路径: [['right', 'right', 'right'], ['right', 'right', 'right'], ['right', 'right', '']]
可以看到,我们得到的最大值是 21,最大路径为从左上角到右下角的所有右移操作。