1.题目
2.思路
(1)dp[i][j]的定义:从起点(0,0)到位置(i,j)的最小路径和
(2)dp[i][j]的递推公式:对于位置(i,j)只能从(i-1,j)或(i,j-1)走过来。所以dp[i,j]=grid[i][j]+Math.min(dp[i-1][j],dp[i][j-1]).
grid[i][j]是消耗当前格子的值,Math.min(dp[i-1][j],dp[i][j-1])是从上走或从左走的路径最小值。
(3)初始化:
起点到起点的路径和(即当前格子)dp[0][0]=grid[0][0]
第一行(从左走来)
dp[0][j]=dp[0][j-1]+grid[0][j]
第一列(从上走来)
dp[i][0]=dp[i-1][0]+grid[i][0]
(4)遍历顺序:从上到下,从左到右
3.代码实现
java
class Solution {
public int minPathSum(int[][] grid) {
//行数
int m=grid.length;
//列数
int n=grid[0].length;
//边界情况,只有一行或者只有一列,这样就无法从左上角走到右下角,所以最小路径和为0
if(m==0||n==0)
{return 0;}
//定义dp数组
int[][] dp=new int[m][n];
dp[0][0]=grid[0][0];
//初始化第一列
for(int i=1;i<m;i++)
{//因为是求最小路径和,当前元素的值,等于他左边元素加上当前元素的值
dp[i][0]=dp[i-1][0]+grid[i][0];
}
//初始化第一行
for(int j=1;j<n;j++)
{
dp[0][j]=dp[0][j-1]+grid[0][j];
}
//第一行和第一列已经初始化过了,所以我们从第二行第二列开始。
for(int i=1;i<m;i++)
{
for(int j=1;j<n;j++)
{
dp[i][j]=grid[i][j]+Math.min(dp[i-1][j],dp[i][j-1]);
}
}
return dp[m-1][n-1];
}
}```