📌  相关文章
📜  从第 0 行的任何单元格开始到第 (N-1) 行的任何单元格结束的最大路径和(1)

📅  最后修改于: 2023-12-03 15:22:01.116000             🧑  作者: Mango

从第 0 行的任何单元格开始到第 (N-1) 行的任何单元格结束的最大路径和介绍

什么是路径和

路径和是指从一个网格的起始位置到达终点位置的所有格子中数字的和。对于一个 n * n 的网格,有多种从起点到终点的路径。例如,对于如下网格。

2 3 4
5 1 6
7 9 8

从起点 2 到终点 8 可以有两种路径,一种是 2 -> 3 -> 1 -> 9 -> 8,路径和为 23,另一种是 2 -> 5 -> 7 -> 9 -> 8,路径和为 31。

什么是最大路径和

最大路径和是指从一个网格的起始位置到达终点位置的所有路径中数字之和最大的路径。对于上述例子,最大路径和为 31。

求解最大路径和

要求解从第 0 行的任何单元格开始到第 (N-1) 行的任何单元格结束的最大路径和,常用的算法是动态规划。

我们定义一个二维数组 dp,其中 dp[i][j] 表示从第 0 行第 j 个单元格开始到第 i 行第 j 个单元格结束的最大路径和。从第 1 行(即第 0 个单元格)开始逐行计算最大路径和,直到计算到第 N-1 行(即第 n-1 个单元格)。

对于每个 dp[i][j],它可以由它上方和左上方的两个单元格转移得到。转移方程如下:

dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]) + grid[i][j]

其中 grid 表示输入的 n * n 网格,grid[i][j] 表示第 i 行第 j 个单元格中的数字。

最终,第 N-1 行的最大路径和即为该问题的解。

下面是一个 Python 实现的示例代码:

def max_path_sum(grid):
    n = len(grid)
    dp = [[0] * n for _ in range(n)]
    dp[0][0] = grid[0][0]
    for i in range(1, n):
        dp[i][0] = dp[i-1][0] + grid[i][0]
        dp[i][i] = dp[i-1][i-1] + grid[i][i]
        for j in range(1, i):
            dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]) + grid[i][j]
    return max(dp[n-1])

该函数接受一个 n * n 的网格作为参数,返回从第 0 行任何单元格开始到第 n-1 行的任何单元格结束的最大路径和。对于上述例子,调用 max_path_sum([[2,3,4],[5,1,6],[7,9,8]]) 将返回 31。

总结

本文介绍了什么是路径和、什么是最大路径和以及如何通过动态规划求解从第 0 行的任何单元格开始到第 (N-1) 行的任何单元格结束的最大路径和。最终,我们得到了一个 Python 实现的示例代码。