📜  矩阵中的最大和路径(1)

📅  最后修改于: 2023-12-03 14:56:29.613000             🧑  作者: Mango

矩阵中的最大和路径

介绍

在一个二维矩阵中,要求找到一条从入口到出口路径,路径上的所有数字之和最大。

路径的限制条件为:只能向右或向下走。

例如下面的 4x4 矩阵中,最大和路径为 9 -> 5 -> 8 -> 7 -> 5,路径上的数之和为 34。

| 9 | 5 | 3 | 0 | |:-:|:-:|:-:|:-:| | 7 | 5 | 1 | 3 | | 1 | 3 | 4 | 1 | | 2 | 4 | 7 | 5 |

此题可以采用动态规划的思想来求解,具体实现见下文。

思路

设 $dp[i][j]$ 表示从矩阵左上角到 $(i,j)$ 点的最大和路径的数字之和。

那么我们可以得到以下的状态转移方程:

$$dp[i][j] = \max(dp[i-1][j], dp[i][j-1]) + matrix[i][j]$$

其中 $matrix[i][j]$ 表示矩阵中第 $i$ 行第 $j$ 列的数字。

为了方便处理边界情况,我们可以在矩阵上方和左侧分别加上一行和一列全是 0 的边界。

最终的答案就是 $dp[m-1][n-1]$,其中 $m$ 和 $n$ 分别为矩阵的行数和列数。

代码

下面是 Python 代码实现:

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

时间复杂度为 $O(mn)$,空间复杂度为 $O(mn)$。

总结

矩阵中的最大和路径是一道典型的动态规划问题,本题的思路和求解方法都比较简单,只需要按照上述思路进行实现即可。