Skip to content

Commit d6f3917

Browse files
authored
Create cherry-pickup-ii.cpp
1 parent f34412b commit d6f3917

File tree

1 file changed

+66
-0
lines changed

1 file changed

+66
-0
lines changed

C++/cherry-pickup-ii.cpp

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
// Time: O(m * n^2)
2+
// Space: O(n^2)
3+
4+
class Solution {
5+
public:
6+
int cherryPickup(vector<vector<int>>& grid) {
7+
vector<vector<vector<int>>> dp(2,
8+
vector<vector<int>>(grid[0].size() + 2,
9+
vector<int>(grid[0].size() + 2, numeric_limits<int>::min())));
10+
11+
dp[0][1][grid[0].size()] = grid[0][0] + grid[0][grid[0].size() - 1];
12+
int result = 0;
13+
for (int i = 1; i < grid.size(); ++i) {
14+
for (int j = 1; j <= grid[0].size(); ++j) {
15+
for (int k = 1; k <= grid[0].size(); ++k) {
16+
int max_prev_dp = numeric_limits<int>::min();
17+
for (int d1 = -1; d1 <= 1; ++d1) {
18+
for (int d2 = -1; d2 <= 1; ++d2) {
19+
max_prev_dp = max(max_prev_dp, dp[(i - 1) % 2][j + d1][k + d2]);
20+
}
21+
}
22+
dp[i % 2][j][k] = (max_prev_dp == numeric_limits<int>::min()) ? numeric_limits<int>::min() :
23+
max_prev_dp + ((j != k) ? (grid[i][j - 1] + grid[i][k - 1]) : grid[i][j - 1]);
24+
result = max(result, dp[i % 2][j][k]);
25+
}
26+
}
27+
}
28+
return result;
29+
}
30+
};
31+
32+
// Time: O(m * n^2)
33+
// Space: O(n^2)
34+
class Solution2 {
35+
public:
36+
int cherryPickup(vector<vector<int>>& grid) {
37+
vector<vector<vector<int>>> dp(2,
38+
vector<vector<int>>(grid[0].size(),
39+
vector<int>(grid[0].size(), numeric_limits<int>::min())));
40+
41+
dp[0][0][grid[0].size() - 1] = grid[0][0] + grid[0][grid[0].size() - 1];
42+
int result = 0;
43+
for (int i = 1; i < grid.size(); ++i) {
44+
for (int j = 0; j < grid[0].size(); ++j) {
45+
for (int k = 0; k < grid[0].size(); ++k) {
46+
int max_prev_dp = numeric_limits<int>::min();
47+
for (int d1 = -1; d1 <= 1; ++d1) {
48+
if (!(0 <= j + d1 && j + d1 < grid[0].size())) {
49+
continue;
50+
}
51+
for (int d2 = -1; d2 <= 1; ++d2) {
52+
if (!(0 <= k + d2 && k + d2 < grid[0].size())) {
53+
continue;
54+
}
55+
max_prev_dp = max(max_prev_dp, dp[(i - 1) % 2][j + d1][k + d2]);
56+
}
57+
}
58+
dp[i % 2][j][k] = (max_prev_dp == numeric_limits<int>::min()) ? numeric_limits<int>::min() :
59+
max_prev_dp + ((j != k) ? (grid[i][j] + grid[i][k]) : grid[i][j]);
60+
result = max(result, dp[i % 2][j][k]);
61+
}
62+
}
63+
}
64+
return result;
65+
}
66+
};

0 commit comments

Comments
 (0)