-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMaxValue.cpp
More file actions
82 lines (67 loc) · 2.1 KB
/
MaxValue.cpp
File metadata and controls
82 lines (67 loc) · 2.1 KB
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//
// Created by Wanhui on 3/20/20.
//
#include "MaxValue.h"
int Solution47::maxValue(std::vector<std::vector<int>> &grid) {
if (grid.empty()) {
return 0;
}
// 矩阵的行数和列数
int m = grid.size();
int n = grid[0].size();
// 存储当前礼物最大值的矩阵,
// 对应礼物矩阵的每个点
std::vector<std::vector<int>> dp(m, std::vector<int>(n, 0));
// 对礼物最大值矩阵的第一行和第一列初始化
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];
}
// 当前点的礼物最大值是当前礼物的值加上左点或上点礼物最大值中较大的值
// 状态转移方程:
// dp[i][j] = std::max(dp[i-1][j], dp[i][j-1]) + grid[i][j]
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
dp[i][j] = std::max(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
}
}
// 返回礼物最大值矩阵的最后一个点的值
return dp[m - 1][n - 1];
}
int Solution47::maxValue2(std::vector<std::vector<int>> &grid) {
if (grid.empty()) {
return 0;
}
// 矩阵的行数和列数
int m = grid.size();
int n = grid[0].size();
// 存储当前礼物的最大值
std::vector<int> dp(n + 1, 0);
// dp[j+1]保存上一点的最大值
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
dp[j + 1] = std::max(dp[j], dp[j + 1]) + grid[i][j];
}
}
return dp[n];
// // 初始化第一行的礼物最大值
// for (int j = 0; j < n; j++) {
// dp[j] = dp[j - 1] + grid[0][j];
// }
//
// for (int i = 1; i < m; i++) {
// // 初始化第一列的礼物最大值
// dp[0] += grid[i][0];
//
// // 因为dp[j]在更新前仍然是上面点的礼物最大值,
// // 所以可以利用此压缩空间
// for (int j = 1; j < n; j++) {
// dp[j] = std::max(dp[j], dp[j - 1]) + grid[i][j];
// }
// }
//
// return dp[n - 1];
}