-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy path064_Minimum_Path_Sum.cpp
46 lines (40 loc) · 1.24 KB
/
064_Minimum_Path_Sum.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int nr = grid.size();
if (nr == 0) return 0;
int nc = grid[0].size();
vector<int> dp(nc + 1, INT_MAX); // 由于dp[r][c] = min(dp[r-1][c], dp[r][c-1]) + grid[r][c],因此可以用一维数组节约空间
dp[1] = 0;
for (int r = 1; r < nr + 1; r++)
{
for (int c = 1; c < nc + 1; c++)
{
dp[c] = min(dp[c], dp[c - 1]) + grid[r - 1][c - 1]; // dp[r][c] = min(dp[r-1][c], dp[r][c-1])
}
}
return dp.back();
// 一致的思路,但稍微容易理解一点
// 另外,由于更详细的分支,减少了 nr+nc 次 min 比较,稍微快了一些
//int nr = grid.size();
//if (nr == 0) return 0;
//int nc = grid[0].size();
//vector<int> dp(nc + 1, 0);
//for (int r = 0; r < nr; r++)
//{
// for (int c = 0; c < nc; c++)
// {
// if (r == 0 && c == 0) dp[c] = 0; // dp[0][0] = 0
// else if (r == 0) dp[c] = dp[c - 1]; // dp[r][c] = dp[r][c-1]
// else if (c == 0) dp[c] = dp[c]; // dp[r][c] = dp[r-1][c]
// else dp[c] = min(dp[c], dp[c - 1]); // dp[r][c] = min(dp[r-1][c], dp[r][c-1])
// dp[c] += grid[r][c];
// }
//}
//return dp[nc - 1];
}
};