矩阵的最小和
矩阵的最小路径和
http://www.nowcoder.com/questionTerminal/7d21b6be4c6b429bb92d219341c4f8bb
不知道是题目没写请清楚还是我的理解问题,,,,路径和包不包含最后的 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];//看路径和包不包含最后一个位置上的 }