class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param grid int整型vector<vector<>> 
     * @return int整型
     */
    //本题经典的动态规划题目
    //定义一个和棋盘一样大的二维数组dp
    //dp[i][j]的含义为从最左上角来到这个i,j位置能获得的最大价值为dp[i][j]
    int maxValue(vector<vector<int> >& grid) {
        // write code here
        if(grid.size()==0||grid[0].size()==0){
            return 0;
        }
        int m=grid.size();
        int n=grid[0].size();
        int dp[m][n];//定义一个m行n列的dp数组
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                dp[i][j]=0;//初始化为0
            }
        }
        dp[0][0]=grid[0][0];//第一个位置的最大价值肯定是grid[0][0]的值
        //对于第dp一行和第一列的值来说,因为每次只能向右或者向下移动,所以第一行第一列的值很好求
        for(int i=1;i<n;i++){
            dp[0][i]=dp[0][i-1]+grid[0][i];
        }
        for(int j=1;j<m;j++){
            dp[j][0]=dp[j-1][0]+grid[j][0];
        }
        //除了第一行第一列以外的位置,可以来自上方和左边
        for(int i=1;i<m;i++){
            for(int j=1;j<n;j++){
                dp[i][j]=max(dp[i-1][j],dp[i][j-1])+grid[i][j];
            }
        }
        return dp[m-1][n-1];
    }
};