A 3D DP problem

This problem looks hard at the beginning, however, if you read it carefully and figure our all possible things that can define the unique states, you will find the solution.

What we need are:

  • A’s location, B’ location, A + B ‘s current value
  • A and B’s moving directions
  • Special case where a and b share the same location.

Here is a bottom up solution for reference. Although it has 5 layer for loops, the last two layer each one at has 3 value, the last two only 3*3. So the total complexity is O(ROW*COL*COL).

const int  ROW = 71, COL = 71;
int memo[ROW][COL][COL];
class Solution {
public:
int cherryPickup(vector<vector<int>>& grid) {
if (grid.empty() || grid[0].empty()) return 0;
memset(memo, -1, sizeof memo);
const int n = grid.size(), m = grid[0].size();
memo[0][0][m-1] = grid[0][0] + grid[0][m-1];
int ret = memo[0][0][m - 1];
for (int i = 0; i < n - 1; ++i){
for (int a = 0; a< m; ++a){
for (int b = 0; b < m; ++b){
for (int aj = -1; aj <= 1; aj++){
for (int bj = -1; bj <= 1; bj++){
if (memo[i][a][b] == -1)continue;
int val = memo[i][a][b];
int newa = a + aj, newb = b + bj;
if (newa < 0 || newa >= m || newb <0 || newb >= m) continue;
if (newa == newb){
memo[i+1][newa][newb] = max(memo[i+1][newa][newb], val + grid[i+1][newa]);
} else {
memo[i+1][newa][newb] = max(memo[i+1][newa][newb], val + grid[i+1][newa] + grid[i+1][newb]);
}
ret = max(ret, memo[i+1][newa][newb]);
}
}
}
}
}
return ret;
}
};

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

No responses yet

Write a response