1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| class Solution { public int cherryPickup(int[][] grid) { int n = grid.length;
int[][][] dp = new int[2 * n - 1][n][n]; for (int i = 0; i < dp.length; i++) { for (int j = 0; j < n; j++) { for (int k = 0; k < n; k++) { dp[i][j][k] = Integer.MIN_VALUE; } } }
dp[0][0][0] = grid[0][0];
for (int k = 1; k < dp.length; k++) { for (int i1 = 0; i1 <= Math.min(k, n - 1); i1++) { int j1 = k - i1; for (int i2 = 0; i2 <= Math.min(k, n - 1); i2++) { int j2 = k - i2; if (j1 < 0 || j1 > n - 1 || j2 < 0 || j2 > n - 1) { continue; }
int v1 = grid[i1][j1], v2 = grid[i2][j2]; if (v1 == -1 || v2 == -1) { continue; }
int res = dp[k - 1][i1][i2]; if (i1 > 0) { res = Math.max(res, dp[k - 1][i1 - 1][i2]); } if (i2 > 0) { res = Math.max(res, dp[k - 1][i1][i2 - 1]); } if (i1 > 0 && i2 > 0) { res = Math.max(res, dp[k - 1][i1 - 1][i2 - 1]); }
res += v1; if (i1 != i2) { res += v2; }
dp[k][i1][i2] = res; } } }
return Math.max(0, dp[2 * n - 2][n - 1][n - 1]); } }
|