classSolution{public:intcherryPickup(vector<vector<int>>&grid){// The problem is identical as two people start picking cherries// From grid[0][0] simultaneouslyn=grid.size();// dp[x1][y1][x2] := max cherries we could pick from// g[0][0] -> g[x1 - 1][y1 - 1] + g[0][0] -> g[x2 - 1][y2 - 1],// Where y2 = x1 + y1 - x2 (reduce states from 4 to 3)dp.resize(n+1,vector<vector<int>>(n+1,vector<int>(n+1,INT_MIN)));returnmax(0,cherryPickup(grid,0,0,0));}private:intn;vector<vector<vector<int>>>dp;intcherryPickup(constvector<vector<int>>&grid,intx1,inty1,intx2){constinty2=x1+y1-x2;if(x1==n||y1==n||x2==n||y2==n)return-1;if(x1==n-1&&y1==n-1)returngrid[x1][y1];if(grid[x1][y1]==-1||grid[x2][y2]==-1)return-1;int&ans=dp[x1][y1][x2];if(ans>INT_MIN)returnans;ans=max({cherryPickup(grid,x1+1,y1,x2),cherryPickup(grid,x1+1,y1,x2+1),cherryPickup(grid,x1,y1+1,x2),cherryPickup(grid,x1,y1+1,x2+1)});if(ans==-1)returnans;ans+=grid[x1][y1];// Do pick some cherriesif(x1!=x2)// Two people are on different gridsans+=grid[x2][y2];returnans;}};
classSolution{publicintcherryPickup(int[][]grid){// The problem is identical as two people start picking cherries// From grid[0][0] simultaneouslyn=grid.length;dp=newInteger[n][n][n];returnMath.max(0,cherryPickup(grid,0,0,0));}privateintn;// dp[x1][y1][x2] := max cherries we could pick from// g[0][0] -> g[x1 - 1][y1 - 1] + g[0][0] -> g[x2 - 1][y2 - 1],// Where y2 = x1 + y1 - x2 (reduce states from 4 to 3)privateInteger[][][]dp;privateintcherryPickup(int[][]grid,intx1,inty1,intx2){finalinty2=x1+y1-x2;if(x1==n||y1==n||x2==n||y2==n)return-1;if(x1==n-1&&y1==n-1)returngrid[x1][y1];if(grid[x1][y1]==-1||grid[x2][y2]==-1)return-1;if(dp[x1][y1][x2]!=null)returndp[x1][y1][x2];dp[x1][y1][x2]=Math.max(Math.max(cherryPickup(grid,x1+1,y1,x2),cherryPickup(grid,x1+1,y1,x2+1)),Math.max(cherryPickup(grid,x1,y1+1,x2),cherryPickup(grid,x1,y1+1,x2+1)));if(dp[x1][y1][x2]==-1)returndp[x1][y1][x2];dp[x1][y1][x2]+=grid[x1][y1];// Do pick some cherriesif(x1!=x2)// Two people are on different gridsdp[x1][y1][x2]+=grid[x2][y2];returndp[x1][y1][x2];}}
classSolution{public:intcherryPickup(vector<vector<int>>&grid){constintn=grid.size();// dp[x1][y1][x2] := max cherries we could pick from// g[0][0] -> g[x1 - 1][y1 - 1] + g[0][0] -> g[x2 - 1][y2 - 1],// Where y2 = x1 + y1 - x2 (reduce states from 4 to 3)vector<vector<vector<int>>>dp(n+1,vector<vector<int>>(n+1,vector<int>(n+1,-1)));dp[1][1][1]=grid[0][0];for(intx1=1;x1<=n;++x1)for(inty1=1;y1<=n;++y1)for(intx2=1;x2<=n;++x2){constinty2=x1+y1-x2;if(y2<1||y2>n)continue;if(grid[x1-1][y1-1]==-1||grid[x2-1][y2-1]==-1)continue;constintans=max({dp[x1-1][y1][x2],dp[x1-1][y1][x2-1],dp[x1][y1-1][x2],dp[x1][y1-1][x2-1]});if(ans<0)continue;dp[x1][y1][x2]=ans+grid[x1-1][y1-1];if(x1!=x2)dp[x1][y1][x2]+=grid[x2-1][y2-1];}returnmax(0,dp[n][n][n]);}};