思路分析:
-
基本思路: 本算法采用动态规划的思想,通过构建一个额外的二维矢量
dp
来存储每个位置的最小路径和。最终目标是求得右下角位置的最小路径和,即整个网格的最小路径和。 -
初始化:
- 初始化矢量的行数和列数,并处理特殊情况,若矢量大小为 1x1,直接返回该元素值作为路径和。
- 创建二维矢量
dp
,其大小与输入矢量相同,用于存储最小路径和的中间结果。
-
初始路径和:
- 将
dp[0][0]
初始化为网格起点的值。 - 初始化第一列和第一行的路径和,分别累加上方和左侧的路径和。
- 将
-
状态转移方程:
- 通过两层嵌套循环遍历网格中的每个位置
(i, j)
,计算dp[i][j]
的最小路径和。 - 使用状态转移方程
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
,表示当前位置的最小路径和为其上方和左侧最小路径和的较小者,再加上当前位置的值。
- 通过两层嵌套循环遍历网格中的每个位置
-
返回结果:
- 最终返回
dp[n-1][m-1]
,即右下角位置的最小路径和,代表整个网格的最小路径和。
- 最终返回
class Solution {
public:
// 定义一个成员函数 minPathSum,接受一个二维矢量 grid 作为输入,返回最小路径和的整数结果
int minPathSum(vector<vector<int>>& grid) {
// 获取二维矢量的行数和列数
int n = grid.size();
int m = grid[0].size();
// 如果矢量大小为 1x1,直接返回该元素值作为路径和
if (n == 1 && m == 1)
return grid[0][0];
// 创建一个二维矢量 dp 用于存储每个位置的最小路径和
vector<vector<int>> dp(n, vector<int>(m, 0));
// 初始化 dp[0][0] 为起点的值
dp[0][0] = grid[0][0];
// 初始化第一列的路径和,每个位置的值等于上方位置的路径和加上当前位置的值
for (int i = 1; i < n; i++)
dp[i][0] = dp[i - 1][0] + grid[i][0];
// 初始化第一行的路径和,每个位置的值等于左侧位置的路径和加上当前位置的值
for (int i = 1; i < m; i++)
dp[0][i] = dp[0][i - 1] + grid[0][i];
// 计算每个位置的最小路径和,状态转移方程为 dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
}
}
// 返回右下角位置的最小路径和,即整个网格的最小路径和
return dp[n - 1][m - 1];
}
};