DDSA Solutions

Chocolates Pickup

Time: O(n*m^2)
Space: O(m^2)

Problem Overview

Two people traverse grid from top to bottom simultaneously, maximize total chocolate picked.

See our study guide for structured GFG and LeetCode practice.

Intuition

Two people traverse grid from top to bottom simultaneously, maximize total chocolate picked. 3D DP.

Algorithm

  1. 1DP state: (row, col1, col2). Both move down, each can go left/diagonal/right. Sum chocolates (avoid double-counting same cell).

Common Pitfalls

  • Same as LC 1463 (Cherry Pickup II). DP[r][c1][c2]. O(n*m^2) with memoization.
Chocolates Pickup.java
Java

// Approach: 3D DP where state (i, j1, j2) represents row i with robot1 at col j1 and robot2 at col j2.
// Both robots start at row 0 from opposite ends and move down together. At each row, try all 9
// combinations of moves (-1, 0, +1) for each robot, taking the best transition from the previous row.
// Collect grid[i][j1] + grid[i][j2] (count once if j1==j2). Optimize to 2D rolling arrays.
// Time: O(n*m^2) Space: O(m^2)
class Solution {

    public int maxChocolate(int grid[][]) {
        int n = grid.length, m = grid[0].length;
        int[][] dp = new int[m][m];

        for (int j1 = 0; j1 < m; j1++) {
            for (int j2 = 0; j2 < m; j2++) {
                if (j1 == j2) {
                    dp[j1][j2] = grid[n - 1][j1];
                } else {
                    dp[j1][j2] = grid[n - 1][j1] + grid[n - 1][j2];
                }
            }
        }

        for (int i = n - 2; i >= 0; i--) {
            int[][] cur = new int[m][m];
            for (int j1 = 0; j1 < m; j1++) {
                for (int j2 = 0; j2 < m; j2++) {
                    int max = -1;
                    for (int d1 = -1; d1 <= 1; d1++) {
                        for (int d2 = -1; d2 <= 1; d2++) {
                            int nj1 = j1 + d1, nj2 = j2 + d2;
                            if (nj1 >= 0 && nj1 < m && nj2 >= 0 && nj2 < m) {
                                max = Math.max(max, dp[nj1][nj2]);
                            }
                        }
                    }
                    int curChoco = (j1 == j2) ? grid[i][j1] : grid[i][j1] + grid[i][j2];
                    cur[j1][j2] = curChoco + max;
                }

            }
            dp = cur;
        }

        return dp[0][m - 1];
    }
}
Was this solution helpful?