力扣3148.矩阵中的最大得分
题目解析及思路
题目要求找到最大的得分
即差距最大的左上和右下的元素值
-
类似二维前缀和,这里s存的是前缀区间的最小值而不是和
-
f[i+1][j+1]
为左上角在(0,0)右下角在(i,j)的子矩阵的最小值 -
f[i+1][j+1]=min(f[i+1][j],f[i][j+1],grid[i][j])
- 枚举右下角 求(i,j) - (0,0)的子矩阵的最小值
- 每次与当前点作差 求答案
代码
class Solution {
public:
int maxScore(vector<vector<int>>& grid) {
int res = INT_MIN;
int m = grid.size(),n = grid[0].size();
vector<vector<int>> s(m+1,vector<int>(n+1,INT_MAX));
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
//子矩阵(0,0) - (i,j)的不包含(i,j)的最小值
int t = min(s[i][j+1],s[i+1][j]);
res = max(res,grid[i][j] - t);
s[i+1][j+1] = min(t,grid[i][j]);
}
return res;
}
};