import java.util.*;


public class Solution {
    public int maxValue (int[][] grid) {
        int[][] dp = new int[grid.length][grid[0].length];
        // 处理只有一行或者一列的情况
        if(grid.length == 1){
            int res = 0;
            for(int i = 0;i<grid[0].length;i++){
                res += grid[0][i];
            }
            return res;
        }
        if(grid[0].length == 1){
            int res = 0;
            for(int i = 0;i<grid.length;i++){
                res += grid[i][0];
            }
            return res;
        }
        // 初始化dp数组,将第一行和第一列的值初始化
        dp[0][0] = grid[0][0];
        for(int i = 1;i<grid.length;i++){
            dp[i][0] = dp[i-1][0] + grid[i][0];
        }
        for(int j = 1;j<grid[0].length;j++){
            dp[0][j] = dp[0][j - 1] + grid[0][j];
        }

        // 除第一行和第一列外,dp[i][j] = Math.max(dp[i-1][j],dp[i][j - 1]) + grid[i][j];
        // 计算出所有的值
        for(int i = 1;i<grid.length;i++){
            for(int j = 1;j<grid[0].length;j++){
                dp[i][j] = Math.max(dp[i-1][j],dp[i][j - 1]) + grid[i][j];
            }
        }
        // 最后返回右下角出口的结果
        return dp[grid.length-1][grid[0].length-1];
    }
}