原题链接
解题思路:直观看上去就是一个dfs遍历所有的可能值,然后进行比较返回值(这种方式会超时),由于会把所有的可能性都罗列出来,所以结果集十分巨大,且会超时,以下还是把这种方式写出来,以供参考
int res64=Integer.MAX_VALUE;
public int minPathSumDfs(int[][] grid) {
dfs64(0,0,grid,grid[0][0]);
return res64;
}
public void dfs64(int nowL,int nowR,int[][] grid,int score){
if (nowL<0 || nowR<0 || nowL>=grid.length || nowR >=grid[0].length)
return;
if (nowL==grid.length-1 && nowR == grid[0].length-1){
res64=Math.min(res64,score);
return;
}
dfs64(nowL+1,nowR,grid,score+grid[nowL][nowR]);
dfs64(nowL,nowR+1,grid,score+grid[nowL][nowR]);
}
dp思路:由于只能够左右移动,所以如grid[1][1]只能够从grid[0][1]或grid[1][0]中移动过来,也就是说dp[1][1]=dp[1][1]+Math.min(dp[1][0],dp[0][1]),这就是题目这题所需要的状态转移方程了,其中需要注意的是如grid[2][0]它只能够从grid[1][0]中过来,也就是说我们需要考虑一下边界的情况。最后答案就是grid中的右下角的值。
public int minPathSum(int[][] grid) {
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[i].length; j++) {
if (i==j && i==0)
grid[i][j]=grid[i][j];
else
grid[i][j]=grid[i][j] + Math.min((i-1)<0?Integer.MAX_VALUE:grid[i-1][j],(j-1)<0?Integer.MAX_VALUE:grid[i][j-1]);
}
}
return grid[grid.length-1][grid[0].length-1];
}