剑指 Offer 47. 礼物的最大价值(中等)

发布时间 2023-08-24 20:58:44作者: 孜孜不倦fly

题目:

class Solution {
public:
    int maxValue(vector<vector<int>>& grid) {
        if(grid.empty()) return 0;      //要考虑棋盘为空的情况直接返回0
        vector<vector<int>> dp(grid.size(), vector(grid[0].size(), 0));      //定义一个和棋盘同样大小的dp数组,每个位置记录的是,走到该位置时礼物的最大价值。
        dp[0][0] = grid[0][0];      //初始化第一格的最大礼物价值,即第一格的礼物价值
        for(int i=1;i<grid.size();i++) dp[i][0]=dp[i-1][0]+grid[i][0];      //初始化只走第一列的最大价值
        for(int j=1;j<grid[0].size();j++) dp[0][j]=dp[0][j-1]+grid[0][j];      //初始化只走第一行的最大价值
        for(int i=1;i<grid.size();i++){      //因为前面做过的初始化工作,所以从第二行第二列开始遍历
            for(int j=1;j<grid[0].size();j++){
                dp[i][j]=max(dp[i-1][j], dp[i][j-1])+grid[i][j];      //每一个dp状态,要么是从上面来的,要么是从左边来的。这是为什么要初始化第一行和第一列的原因,因为他们没法从上面来或者从左边来
            }                                                         //也就是说,如何初始化dp取决于遍历方向和递推方式
        }
        return dp[grid.size()-1][grid[0].size()-1];      //返回走到右下角时的最大礼物价值
    }
};