前言:做这个题目的时候,没有看清楚题目的本质,其实就是找两个点,求他们的差的最大值就行,为什么,因为中间途径的点都可以消去,另外,学习一下前缀和的思路记录最小值
用dp [ i +1 ] [ j +1 ] 记录到 a[ i ] [ j ] 的最小值 ,为啥是 i +1 , j +1 呢,这是因为我们的下标从0开始,烦死了
class Solution {
public:
int maxScore(vector<vector<int>>& grid) {
int n = grid.size(), m = grid[0].size();
int ans = INT_MIN;
vector<vector<int>> dp(n + 2, vector<int>(m + 2, INT_MAX));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int u = min(dp[i + 1][j], dp[i][j + 1]); // 因为我们必须移动一次且不能是自己
ans = max(ans, grid[i][j] - u);
dp[i + 1][j + 1] = min(grid[i][j], u);
}
}return ans;
}
};