## DEV Community 👩‍💻👨‍💻

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.length][grid.length];
for(int i =0;i<dp.length;i++){
for(int matrix[] : dp[i]){
Arrays.fill(matrix,-1);
}
}
return solve(grid,0,0,grid.length-1,dp);
}
public int solve(int[][] grid, int i,int j1,int j2,int [][][] dp){
if(j1<0 || j2<0 || j1>=grid.length || j2 >= grid.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;
}
}
``````