C++代码解题:用动态规划解决给定一个包含非负整数的 3*3网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。每一行代码都要要注释详细
时间: 2024-03-06 17:51:07 浏览: 52
好的,这是一个经典的动态规划问题,可以使用二维数组来存储状态,以下是C++代码实现:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size(); // 网格的行数
int n = grid[0].size(); // 网格的列数
vector<vector<int>> dp(m, vector<int>(n)); // 定义二维数组dp,存储状态
// 初始化第一行和第一列
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] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j];
}
}
return dp[m-1][n-1]; // 返回最小路径和
}
int main() {
vector<vector<int>> grid = {{1,3,1}, {1,5,1}, {4,2,1}};
cout << minPathSum(grid) << endl; // 输出最小路径和,应为7
return 0;
}
```
代码注释如下:
1. 首先定义函数`minPathSum`,输入参数为二维向量`grid`,表示输入的网格;返回值为最小路径和。
2. 获取网格的行数和列数。
3. 定义二维数组`dp`,存储状态。`dp[i][j]`表示从起点`(0,0)`到网格`(i,j)`的最小路径和。
4. 初始化第一行和第一列。由于每次只能向下或向右移动,因此第一行和第一列的最小路径和只能由其前面的元素累加得出。
5. 动态规划遍历。对于网格中的每个元素`(i,j)`,其最小路径和为其上方和左侧元素中的较小值加上自身的值。
6. 返回最小路径和,即`dp[m-1][n-1]`。
7. 在`main`函数中,定义输入的网格`grid`,并输出最小路径和。
阅读全文