class Solution {
public:
    /**
     * 
     * @param matrix int整型vector<vector<>> the matrix
     * @return int整型
     */
    /*
        dp(i,j) 表示从(0,0)到(i,j)的路径和。
        dp(i,j) = min(dp(i-1,j),dp(i,j-1)) + matrix(i,j);
        对于只有一行或者一列的需初始化。--这个下了点功夫。
    */
    int minPathSum(vector<vector<int> >& matrix) {
        int colum = matrix.size(), line = matrix[0].size();
        vector<vector<int>> dp (colum, vector<int>(line, 0));
        for (int i = 0; i < colum; i++) {
            for (int j = 0; j < line; j++) {
                if(i == 0 && j == 0) { 
                    dp[i][j] = matrix[0][0];
                } else if (i == 0) {
                    dp[i][j] = dp[0][j - 1] + matrix[0][j];
                } else if (j == 0){
                    dp[i][j] = dp[i-1][0] + matrix[i][0];                    
                } else {
                    dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + matrix[i][j];
                }
            }
        }
        return dp[colum-1][line-1];        // write code here
    }
};