题目链接:64. 最小路径和

题解:

和前两道类似,同样使用动态规划!

题目简述:

给定一个方格,从左上走到右下,求最小代价!

题解:

动态规划:

状态表示: f[i][j]表示到达当前点的最小代价

状态计算: 在不越界的情况下 f[i][j] = min(f[i - 1][j], f[i][j - 1]) + grid[i][j]

初始转态:f[0][0] = gird[0][0]

最终结果:f[n - 1][m - 1]

时间复杂度: $O(n \times m)$

AC代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int n = grid.size(), m = grid[0].size();
vector<vector<int>> f(n, vector<int>(m, INT_MAX));
f[0][0] = grid[0][0];
for(int i = 0; i < n; i++){
for(int j =0; j < m; j++){
if(i && j) f[i][j] = min(f[i - 1][j], f[i][j - 1]) + grid[i][j];
else if(i) f[i][j] = f[i - 1][j] + grid[i][j];
else if(j) f[i][j] = f[i][j - 1] + grid[i][j];
}
}
return f[n - 1][m - 1];
}
};