📌  相关文章
📜  从矩阵左上角到右下角的最大点并返回(1)

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

从矩阵左上角到右下角的最大点并返回

问题描述

给定一个大小为 $m \times n$ 的非负整数矩阵,找出一条从左上角到右下角的路径,使得路径上所有点的数值之和最大,并返回该路径上的最大点。

解决方法
动态规划

我们可以使用动态规划来解决这个问题。我们令 $f(i,j)$ 表示从矩阵左上角到点 $(i,j)$ 的最大值。假设现在我们已经求出了 $f(i-1,j)$ 和 $f(i,j-1)$,接下来我们需要求出 $f(i,j)$。由于每个格子只能从上方或者左方的格子到达,因此 $f(i,j)$ 的值可以通过 $f(i-1,j)$ 和 $f(i,j-1)$ 推算得到:

$$f(i,j) = \max{f(i-1,j), f(i,j-1)}+a_{ij}$$

其中 $a_{ij}$ 表示矩阵中第 $i$ 行第 $j$ 列的数值。

最后,$f(m,n)$ 就是从矩阵左上角到右下角的最大值。我们还可以通过记录每个点是从哪个方向到达的来还原出最大路径。

代码实现

下面是一份 Python 代码的例子:

def getMax(matrix):
    m, n = len(matrix), len(matrix[0])
    f = [[0]*n for _ in range(m)]
    path = [[0]*n for _ in range(m)]
    for i in range(m):
        for j in range(n):
            if i == 0 and j == 0:
                f[0][0] = matrix[0][0]
            elif i == 0:
                f[i][j] = f[i][j-1] + matrix[i][j]
                path[i][j] = "left"
            elif j == 0:
                f[i][j] = f[i-1][j] + matrix[i][j]
                path[i][j] = "up"
            else:
                if f[i-1][j] > f[i][j-1]:
                    f[i][j] = f[i-1][j] + matrix[i][j]
                    path[i][j] = "up"
                else:
                    f[i][j] = f[i][j-1] + matrix[i][j]
                    path[i][j] = "left"
    return f[m-1][n-1], path

# 示例
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
maxVal, maxPath = getMax(matrix)
print("最大值:", maxVal)
print("最大路径:", maxPath)
运行结果

我们使用上面的例子来运行这份代码:

最大值: 21
最大路径: [['right', 'right', 'right'], ['right', 'right', 'right'], ['right', 'right', '']]

可以看到,我们得到的最大值是 21,最大路径为从左上角到右下角的所有右移操作。