📜  矩阵中从上到下再到后的最大求和路径(1)

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

矩阵中从上到下再到后的最大求和路径

这是一个经典的动态规划问题,其应用广泛,例如图像处理、机器视觉、自然语言处理等领域。

问题描述

给定一个 $n \times m$ 的矩阵 $M$,其中 $M_{i,j}$ 表示矩阵中第 $i$ 行第 $j$ 列的元素。

定义从矩阵的某一位置出发,每次只能向下或向右移动一格,直到到达矩阵的右下角,经过的路径上所有元素的和为该路径的长度。求所有路径中长度最大的路径。

算法思路

该问题可以用动态规划来解决。

设 $dp_{i,j}$ 表示从矩阵中 $(1,1)$ 到 $(i,j)$ 的最大路径长度,$M_{i,j}$ 表示矩阵中第 $i$ 行第 $j$ 列的元素,则有:

$$ dp_{i,j} = \max(dp_{i-1,j}, dp_{i,j-1}) + M_{i,j} $$

其中 $dp_{i-1,j}$ 表示从 $(1,1)$ 到 $(i-1,j)$ 的最大路径长度,$dp_{i,j-1}$ 表示从 $(1,1)$ 到 $(i,j-1)$ 的最大路径长度。

最终结果即为 $dp_{n,m}$。

代码实现
def max_path_sum(matrix):
    """
    矩阵中从上到下再到后的最大求和路径

    :param matrix: 矩阵
    :type matrix: List[List[int]]
    :return: 最大路径的长度
    :rtype: int
    """
    if not matrix:
        return 0

    n, m = len(matrix), len(matrix[0])
    dp = [[0] * m for _ in range(n)]
    dp[0][0] = matrix[0][0]

    for i in range(1, n):
        dp[i][0] = dp[i-1][0] + matrix[i][0]
    for j in range(1, m):
        dp[0][j] = dp[0][j-1] + matrix[0][j]

    for i in range(1, n):
        for j in range(1, m):
            dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + matrix[i][j]

    return dp[n-1][m-1]
复杂度分析

时间复杂度:$O(nm)$

空间复杂度:$O(nm)$

参考资料