不知道是题目没写请清楚还是我的理解问题,,,,路径和包不包含最后的 matrix[m-1][n-1],,,,坑的是样例的这个数字是0,,,,害,搞了很久。

1 dfs 深搜尝试所有的可能性,找出最大的(超时)

dfs(matrix,x,y,m,n,0) +matrix[m-1][n-1] 应该才对,这是我之前的思路

public int minPathSum (int[][] matrix) {
    // write code here
    if(matrix==null || matrix.length==0){
        return 0;
    }
    int m=matrix.length;
    int n=matrix[0].length;
    int x=0;
    int y=0;
    return dfs(matrix,x,y,m,n,0);
}
public int  dfs(int [][] matrix ,int x ,int y,int m,int n ,int cost){
    if(x==m-1 && y==n-1){
        return cost;
    }else if(x==m-1){
        cost+=matrix[x][y];
        return dfs(matrix,x,y+1,m,n,cost);
    }else if(y==n-1){
        cost+=matrix[x][y];
        return dfs(matrix,x+1,y,m,n,cost);
    }else{
        cost+=matrix[x][y];
        return Math.min(dfs(matrix,x+1,y,m,n,cost),dfs(matrix,x,y+1,m,n,cost));
    }
}

2 dp 通过

public int minPathSum (int[][] matrix) {
    // write code here
    if(matrix==null || matrix.length==0){
        return 0;
    }
    int m=matrix.length;
    int n=matrix[0].length;
    int [][] dp=new int [m][n];
    for(int x=0;x<m;x++){
        for(int y=0;y<n;y++){
            if(x==0 && y!=0){
                int b=dp[x][y-1] +matrix[x][y-1];
                dp[x][y]=b;
            }else if(y==0 && x!=0){
                int a=dp[x-1][y]+matrix[x-1][y];
                dp[x][y]=a;
            }else if(x==0&& y==0){
                dp[x][y]=0;
            } else{
                int b=dp[x][y-1] +matrix[x][y-1];
                int a=dp[x-1][y]+matrix[x-1][y];
                dp[x][y]=a>b?b:a;
            }
        }
    }
    return dp[m-1][n-1]+matrix[m-1][n-1];//看路径和包不包含最后一个位置上的
}