(一)题目描述
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
(二)思路分析
使用动态规划:当前位置的最短路径和=上一个地方的最短路径和+当前位置的路径
三部曲:
1)定义dp[i][j]的含义:grid[i][j]处的最短路径和
2)初始值:dp[0][i]与dp[i][0]都可进行初始化
3)递推式:dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j]
(三)代码实现
class Solution {
public int minPathSum(int[][] grid) {
// (1)定义dp[i][j]含义:到位置[i][j]的最小路径
// (2)找关系式:dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j]
// (3)找初始值
int rowLen=grid.length;
int colLen=grid[0].length;
int[][] dp=new int[rowLen][colLen];
//定义初始值
for (int i = 0; i < rowLen; i++) {
for (int j = 0; j <=i; j++) {
dp[i][0]+=grid[j][0];
}
}
for (int i = 1; i < colLen; i++) {
for (int j = 0; j <=i; j++) {
dp[0][i]+=grid[0][j];
}
}
//找递推关系
for (int i = 1; i < rowLen; i++) {
for (int j = 1; j < colLen; j++) {
dp[i][j]=Math.min(dp[i-1][j],dp[i][j-1])+grid[i][j];
}
}
return dp[rowLen-1][colLen-1];
}
}
该博客介绍了如何使用动态规划解决从网格左上角到右下角的最小路径和问题。思路涉及定义状态转移方程,初始化边界条件,并通过递推公式计算每个位置的最短路径。提供的代码示例展示了具体的实现过程。
281

被折叠的 条评论
为什么被折叠?



