Skip to content

Commit 863f6b6

Browse files
authored
cherry pickup in dp
imp dp problem
1 parent 7d67a6e commit 863f6b6

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed

C++/DP-cherryPickup.cpp

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
class Solution
2+
{
3+
private:
4+
int maxCherry(int i, int j1, int j2, vector<vector<int>> &grid, vector<vector<vector<int>>> &dp)
5+
{
6+
int n = grid.size();
7+
int m = grid[0].size();
8+
9+
if (j1 < 0 || j2 < 0 || j1 >= m || j2 >= m)
10+
{
11+
return -1e8;
12+
}
13+
if (dp[i][j1][j2] != -1)
14+
return dp[i][j1][j2];
15+
if (i == n - 1)
16+
{
17+
if (j1 == j2)
18+
return grid[i][j1];
19+
else
20+
{
21+
return grid[i][j1] + grid[i][j2];
22+
}
23+
}
24+
25+
int maxi = -1e8;
26+
for (int dj1 = -1; dj1 <= 1; dj1++)
27+
{
28+
for (int dj2 = -1; dj2 <= 1; dj2++)
29+
{
30+
31+
int value = 0;
32+
if (j1 == j2)
33+
value = grid[i][j2];
34+
else
35+
{
36+
value = grid[i][j2] + grid[i][j1];
37+
}
38+
39+
value += maxCherry(i + 1, j1 + dj1, j2 + dj2, grid, dp);
40+
maxi = max(maxi, value);
41+
}
42+
}
43+
return dp[i][j1][j2] = maxi;
44+
}
45+
46+
public:
47+
int cherryPickup(vector<vector<int>> &grid)
48+
{
49+
// int dp[r][c][c];
50+
int n = grid.size();
51+
int m = grid[0].size();
52+
53+
vector<vector<vector<int>>> dp(n, vector<vector<int>>(m, vector<int>(m, 0)));
54+
55+
for (int j1 = 0; j1 < m; j1++)
56+
{
57+
for (int j2 = 0; j2 < m; j2++)
58+
{
59+
if (j1 == j2)
60+
dp[n - 1][j1][j2] = grid[n - 1][j1];
61+
else
62+
{
63+
dp[n - 1][j1][j2] = grid[n - 1][j1] + grid[n - 1][j2];
64+
}
65+
}
66+
}
67+
68+
for (int i = n - 2; i >= 0; i--)
69+
{
70+
for (int j1 = 0; j1 < m; j1++)
71+
{
72+
for (int j2 = 0; j2 < m; j2++)
73+
{
74+
int maxi = -1e8;
75+
for (int dj1 = -1; dj1 <= 1; dj1++)
76+
{
77+
for (int dj2 = -1; dj2 <= 1; dj2++)
78+
{
79+
80+
int value = 0;
81+
if (j1 == j2)
82+
value = grid[i][j2];
83+
else
84+
{
85+
value = grid[i][j2] + grid[i][j1];
86+
}
87+
if (j1 + dj1 >= 0 && j1 + dj1 < m && j2 + dj2 >= 0 && j2 + dj2 < m)
88+
{
89+
value += dp[i + 1][j1 + dj1][j2 + dj2];
90+
}
91+
else
92+
{
93+
value += -1e8;
94+
}
95+
maxi = max(maxi, value);
96+
}
97+
}
98+
dp[i][j1][j2] = maxi;
99+
}
100+
}
101+
}
102+
// return maxCherry(0,0,m-1,grid,dp);
103+
return dp[0][0][m - 1];
104+
}
105+
};

0 commit comments

Comments
 (0)