1. 题目描述
2. 解题思路
(1) 求最大得分可以理解为从左上角找到一个最小值、从右下角找到一个最大值,求差值
;
(2) 定义f[i][j]
表示以f[0][0]
为左上角,f[i][j]
为右下角所表示的矩阵的最小值;
(3) 依次遍历矩阵,找出以每个点作为终点的最大得分。
3. 代码实现
class Solution {
public:
int maxScore(vector<vector<int>>& grid) {
int n = grid.size();
int m = grid[0].size();
// f[i][j]表示以f[0][0]为左上角,f[i][j]为右下角所表示的矩阵的最小值;
vector<vector<int>> f(n + 1, vector<int>(m + 1, INT_MAX));
int res = INT_MIN;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int tmp = min(f[i][j + 1], f[i + 1][j]);
res = max(res, grid[i][j] - tmp);
f[i + 1][j + 1] = min(grid[i][j], tmp);
}
}
return res;
}
};