📌  相关文章
📜  最大化从左上角单元格到给定矩阵的所有其他单元格的路径总和(1)

📅  最后修改于: 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$ 分别为矩阵的行数和列数。