📅  最后修改于: 2023-12-03 15:26:24.892000             🧑  作者: Mango
这个问题可以通过动态规划来解决。我们可以定义一个数组 $dp$,其中 $dp[i][j]$ 表示从左上角单元格到 $(i,j)$ 单元格的最大路径总和。由于只能向下或向右移动,因此可以得到转移方程式:
$$dp[i][j] = \max(dp[i-1][j], dp[i][j-1]) + grid[i][j]$$
其中 $grid[i][j]$ 表示矩阵中 $(i,j)$ 单元格的值。显然,当 $i=0$ 或 $j=0$ 时,即在第一行或第一列,只有唯一的路径可以到达,因此
$$dp[i][0] = \sum_{k=0}^i grid[k][0],\ dp[0][j] = \sum_{k=0}^j grid[0][k]$$
最终,$dp[m-1][n-1]$ 就是从左上角到右下角的最大路径总和。
以下是 Python 实现代码:
def max_path_sum(grid):
m, n = len(grid), len(grid[0])
# 初始化第一行和第一列
for i in range(1, m):
grid[i][0] += grid[i-1][0]
for j in range(1, n):
grid[0][j] += grid[0][j-1]
# 动态规划
for i in range(1, m):
for j in range(1, n):
grid[i][j] += max(grid[i-1][j], grid[i][j-1])
return grid[m-1][n-1]
以上实现的时间复杂度为 $O(mn)$,空间复杂度为 $O(mn)$,其中 $m$ 和 $n$ 分别为矩阵的行数和列数。