分析:该题类 似62 不同路径问题:
LeetCode Hot100 62. 不同路径_FlowShip的博客-优快云博客分析,这种不能回头算最优解的题,一般考虑用冬天规划来做,记录每一个状态的解1.当这个网格是单 行 时,肯定是只有一种方式到达终点那就是一直从左向右横着走到头dp[0][0,1,2,3,....,n-1]= 1;2.当这个网格是单 列时,肯定是只有一种方式到达终点那就是一直从上到下竖着走到头dp[0,1,2,3,....,m-1][0]= 1;3.即:下一个格子到达的可能性肯定是上两个格子能到达的可能性相加即:dp[i][j] = dp[i-1][j...https://blog.youkuaiyun.com/FlowShip/article/details/121984508即从[0][0] ->[m-1][n-1] 有很多种可能的路径,选择格子的数累加起来最小的路径即可,
所以是动态规划问题
所以是动态规划问题
所以是动态规划问题
1. 初始化单行单列的情况:
下面列举初始化单行的情况:
dp[0][0] = grid[0][0]=1
dp[0][1] = dp[0][0] + grid[0][1]=1+3
dp[0][2] = dp[0][0] + grid[0][1] + grid[0][2] = dp[0][1] + grid[0][2]=1+3+1
.........................
dp[0][n-1] = dp[0][n-2] + grid[0][n-1]
2. 例如:
即状态转移方程为:
dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]
public static int minPathSum(int[][] grid) {
int m = grid.length;// m * n 矩阵
int n = grid[0].length;
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] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
}
}
return dp[m - 1][n - 1];
}
本题类似题目: