public class Solution{
/**
 *
 * @param matrix int整型二维数组 the matrix
 * @return int整型
 */
int minPathSum(int [][]matrix) {
    // write code here
    int i = matrix.length;
    int j = matrix[0].length;
    int[][] table = new int[i][j];
    table[0][0] = matrix[0][0];
    for (int k = 1; k < i; k++) {
    table[0][k] = matrix[0][k] + table[0][k - 1];
    }

    //      第一列表格的值,都等于 当前单元格的值 + 上一行单元格的值
    for (int k = 1; k < j; k++){
    table[k][0] = matrix[k][0] + table[k - 1][0];
    }

    // 从1,1开始,每次填充的表格 = min(当前单元格 + 上一个单元格的值,当前单元格 + 左边单元格的值) 取最小路径和
    for (int m = 1; m < i; m++) {
        for (int n = 1; n < j; n++) {
            table[m][n] = Math.min(matrix[m][n] + table[m - 1][n],
                                   matrix[m][n] + table[m][n - 1]);
        }
    }
    // 循环结束, 表格最后一个元素即为解
    return table[i - 1][j - 1];
}
}