DEV Community

Prashant Mishra
Prashant Mishra

Posted on • Originally published at leetcode.com

Cherry Pickup II Leetcode Problem

You are given a rows x cols matrix grid representing a field of cherries where grid[i][j] represents the number of cherries that you can collect from the (i, j) cell.

You have two robots that can collect cherries for you:

  • Robot #1 is located at the top-left corner (0, 0), and
  • Robot #2 is located at the top-right corner (0, cols - 1).

Return the maximum number of cherries collection using both robots by following the rules below:

  • From a cell (i, j), robots can move to cell (i + 1, j - 1), (i + 1, j), or (i + 1, j + 1).
  • When any robot passes through a cell, It picks up all cherries, and the cell becomes an empty cell.
  • When both robots stay in the same cell, only one takes the cherries.
  • Both robots cannot move outside of the grid at any moment.
  • Both robots should reach the bottom row in grid.


Input: grid = [[3,1,1],[2,5,1],[1,5,5],[2,1,1]]
Output: 24
Explanation: Path of robot #1 and #2 are described in color green and blue respectively.
Cherries taken by Robot #1, (3 + 2 + 5 + 2) = 12.
Cherries taken by Robot #2, (1 + 5 + 5 + 1) = 12.
Total of cherries: 12 + 12 = 24.

class Solution {
    // we will use 3dp for optimizing this problem
    public int cherryPickup(int[][] grid) {
        // since both the robots are moving simultaneously hence they will 
        // be at the same row all the time.
        // hence only one row index is needed .
        // j1 is for robot1 and j2 is for robot2
        int dp[][][] = new int[grid.length][grid[0].length][grid[0].length];
        for(int i =0;i<dp.length;i++){
            for(int matrix[] : dp[i]){
                Arrays.fill(matrix,-1);
            }
        }
        return solve(grid,0,0,grid[0].length-1,dp);
    }
    public int solve(int[][] grid, int i,int j1,int j2,int [][][] dp){
        if(j1<0 || j2<0 || j1>=grid[0].length || j2 >= grid[0].length) return 0;
        if(i == grid.length-1) {
            // here are two cases , either both robot1 and robot2 have arrived at the same cell in the last row or different cells in the last row
            if(j1==j2) return grid[i][j1];
            else return grid[i][j1] + grid[i][j2];
        }
        if(dp[i][j1][j2]!=-1) return dp[i][j1][j2];
        int maximum = 0;
        /*
        for every move of robot1 robot2 has the chance to move either rightdiagonal or down or left diagonal
        hence the below code will run for 9 times 
        3*3
        */
        for(int a = j1-1;a<=j1+1;a++){
            for(int b = j2-1;b<=j2+1;b++){
                if(j1==j2) { // since j1 and j2 are same that means robot1 and robot2 are at the same cell . Hence take current cell value + solve() again we can take index j1 or j2 any one as the value at the cell is same
                    maximum =Integer.max(maximum,grid[i][j1]+solve(grid,i+1,a,b,dp));
                }
                else {
                    maximum =Integer.max(maximum,  grid[i][j1]+grid[i][j2] + solve(grid,i+1,a,b,dp));
                }
            }
        }
        return dp[i][j1][j2] = maximum;
    }
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)