题目:最小路径和
相关笔记:不同路径
和上面那题基本一样,只不过状态转移方程变成了**”dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]“**
1int minPathSum(vector<vector<int>>& grid)
2{
3 int r = grid.size(), c = grid[0].size();
4 int dp[r][c];
5 dp[0][0] = grid[0][0];
6 for(int i = 1; i < r; i++) dp[i][0] = grid[i][0] + dp[i - 1][0];
7 for(int i = 1; i < c; i++) dp[0][i] = grid[0][i] + dp[0][i - 1];
8
9 for(int i = 1; i < r; i++)
10 {
11 for(int j = 1; j < c; j++)
12 {
13 dp[i][j] = std::min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
14 }
15 }
16 return dp[r - 1][c - 1];
17}
补充解法:一维滚动数组
1int minPathSum(vector<vector<int>>& grid)
2 {
3 if(grid.empty()) return 0;
4 int m = grid.size(), n = grid[0].size();
5 std::vector<int> dp(n, 0);
6
7 // 初始化第一行
8 dp[0] = grid[0][0];
9 for(int i = 1; i < n; i++)
10 {
11 dp[i] = dp[i - 1] + grid[0][i];
12 }
13
14 // 填充其余行
15 for(int i = 1; i < m; i++)
16 {
17 // 先更新每行第一个元素
18 dp[0] += grid[i][0];
19 for(int j = 1; j < n; j++)
20 {
21 dp[j] = std::min(dp[j], dp[j - 1]) + grid[i][j];
22 }
23 }
24 return dp[n - 1];
25 }
来源:语雀原笔记