📅  最后修改于: 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)$