1.题目描述
2.思路
(1)dp[i][j] 表示从起点 (0,0) 走到位置 (i,j) 的最小路径和
(2)对于位置 (i, j),只能从 上面 (i-1,j) 或 左边 (i,j-1) 走过来,所以:
dp[i][j] = grid[i][j] + min(dp[i-1][j], dp[i][j-1])
当前格子总路径和 = 当前格子的值 + 从上或左走过来的最小路径和
(3)初始化,从起点到起点的路径和(只有这一个格子),要“消耗”这个格子的值了,所以路径和初始就是 1。
起点:dp[0][0] = grid[0][0]
第一行只能从左边走来:
dp[0][j] = dp[0][j-1] + grid[0][j]; // for j in 1…n-1
第一列只能从上面走来:
dp[i][0] = dp[i-1][0] + grid[i][0]; // for i in 1…m-1
(4)遍历顺序:
必须从上到下、从左到右,因为 dp[i][j] 依赖于 dp[i-1][j] 和 dp[i][j-1]。
3.代码实现
class Solution {public int minPathSum(int[][] grid) {//行数,grid[m][n]是存储最小数据和的数据int m=grid.length;//列数int n=grid[0].length;if(m==0||n==0){//只有一行或者一列的情况,不满足找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。return 0;}//向右走,进行数组初始化,初始化第一行,也就是列数n会增加for(int j=1;j<n;j++){//因为是求最小路径和,当前元素的值,等于他左边元素加上当前元素的值grid[0][j]=grid[0][j]+grid[0][j-1];}//向下走,初始化第一列for(int i=1;i<m;i++){grid[i][0]=grid[i][0]+grid[i-1][0];}for(int j=1;j<n;j++){//每次只能向右走for(int i=1;i<m;i++){//每次只能向下走grid[i][j]=grid[i][j]+Math.min(grid[i-1][j],grid[i][j-1]);}}return grid[m-1][n-1];}
}