不知道是题目没写请清楚还是我的理解问题,,,,路径和包不包含最后的 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];//看路径和包不包含最后一个位置上的
}
京公网安备 11010502036488号