题目:3148. 矩阵中的最大得分
思路:题意就是希望找到两个点A、B,且点B一定在点A的右下角。然后求点B减点A的最大差值。
状态f[i][j]:表示在点[i][j]的左上部分的最小值
细节看注释
class Solution {
public:
int maxScore(vector<vector<int>>& grid) {
//最大差值
int mn=INT_MIN;
int n=grid.size(),m=grid[0].size();
//状态f[i][j]:表示在点[i][j]的左上部分的最小值
vector<vector<int>> f(n+1,vector<int>(m+1,INT_MAX));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
//tmp表示除去g[i][j]点外,左上部分的最小值
int tmp=min(f[i][j+1],f[i+1][j]);
//更新最大差值
mn=max(mn,grid[i][j]-tmp);
//保存最小值
f[i+1][j+1]=min(tmp,grid[i][j]);
}
}
return mn;
}
};
优化了一下空间,用一维向量保存每行的最小值(已遍历过的)
class Solution {
public:
int maxScore(vector<vector<int>>& grid) {
int mn=INT_MIN;
int n=grid.size(),m=grid[0].size();
vector<int> col(m,INT_MAX);
for(int i=0;i<n;i++){
//用于保存在j之前的所有行的最小值
int tmp=INT_MAX;
for(int j=0;j<m;j++){
mn=max(mn,grid[i][j]-min(tmp,col[j]));
col[j]=min(col[j],grid[i][j]);
tmp=min(tmp,col[j]);
}
}
return mn;
}
};