文章

3148. 矩阵中的最大得分(Rating 1819)

3148. 矩阵中的最大得分(Rating 1819)

以下内容偏向于记录个人练习过程及思考,非常规题解内容

题目

3148. 矩阵中的最大得分

Rating 1819

思路

脑筋急转弯:需要想清楚一个非常重要结论

从左上某个位置A,经过一系列位置到达右下某个位置B时,得分仅与A和B两个位置的值有关,与路径中的值都无关。

因为

(c1 - c0) + (c2 - c1) + (c3 - c2) + … + (cn - cn-1) = cn - c0

因此,对于每个位置,我们找到其左上最小的值(不包含自己)即可算出以这个位置为终点的得分

遍历所有位置取最大得分即可

而某个位置左上最小的值可以用二维前缀和的思路维护。

代码

1
2
3
4
5
6
7
8
9
10
11
class Solution:
    def maxScore(self, grid: List[List[int]]) -> int:
        m, n = len(grid), len(grid[0])
        premin = [[inf for _ in range(n + 1)] for _ in range(m + 1)] # 二维前缀最小值
        ret = -inf
        for i in range(m):
            for j in range(n):
                mn = min(premin[i + 1][j], premin[i][j + 1]) # 找到左上最小值(不包含自己)
                premin[i + 1][j + 1] = min(grid[i][j], mn) # 更新二维前缀最小值
                ret = max(ret, grid[i][j] - mn) # 更新最大得分
        return ret
本文由作者按照 CC BY 4.0 进行授权