import java.util.*;


public class Solution {
    //1.以第dp[i][j]结尾的最小路径和。
    public static int minPathSum (int[][] matrix) {
        // write code here
        int m = matrix.length;
        int n = matrix[0].length;
        int[][] dp = new int[m+1][n+1];
        //1,初始化 要保证dp数组的第一列和第一行填表时满足逻辑
        dp[0][0] = matrix[0][0];
        //处理第一行
        for(int i=1;i<n;i++){
            //前一个加当前值
            dp[0][i] = matrix[0][i] +dp[0][i-1];
        }
        //处理第一列
        for(int j=1;j<m;j++){
            //上一个加当前值
            dp[j][0] =matrix[j][0] +dp[j-1][0];
        }

        //2.填表
        for(int i=1;i<m;i++){
            for(int j=1;j<n;j++){
                //取两种情况最小值,注意映射关系
                dp[i][j] = Math.min(dp[i-1][j],dp[i][j-1]) + matrix[i][j];

            }
        }

        return dp[m-1][n-1];
    }
}