/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param matrix int整型二维数组 the matrix
 * @param matrixRowLen int matrix数组行数
 * @param matrixColLen int* matrix数组列数
 * @return int整型
 */
int minPathSum(int** matrix, int matrixRowLen, int* matrixColLen ) {
    // write code here
    int row=matrixRowLen;
    int col=*matrixColLen;
    int dp[row][col];//记录当前位置到出口的最小路径和
    memset(dp,0,sizeof(int)*(row*col));

    //填充dp表最后一列和最后一行,因为只能!向下或向右走
  	//测试用例没有row==1||col==1的情况,我就偷懒了
    dp[row-1][col-1]=matrix[row-1][col-1];

    for(int i=row-2;i>=0;i--){
        dp[i][col-1]=dp[i+1][col-1]+matrix[i][col-1];
    }
    for(int j=col-2;j>=0;j--){
        dp[row-1][j]=dp[row-1][j+1]+matrix[row-1][j];
    }

    //填充剩余dp表
    for(int i=row-2;i>=0;i--){
        for(int j=col-2;j>=0;j--){
            dp[i][j]=matrix[i][j]+(dp[i+1][j]<dp[i][j+1]?dp[i+1][j]:dp[i][j+1]);
        }
    }

    return dp[0][0];
}