|
| 1 | +/** |
| 2 | + * @param {number[][]} grid |
| 3 | + * @return {number} |
| 4 | + */ |
| 5 | +var maxScore = function (grid) { |
| 6 | + const n = grid.length |
| 7 | + const m = grid[0].length |
| 8 | + const values = [] |
| 9 | + |
| 10 | + for (let i = 0; i < n; i++) { |
| 11 | + for (let j = 0; j < m; j++) { |
| 12 | + values.push([grid[i][j], i, j]) |
| 13 | + } |
| 14 | + } |
| 15 | + |
| 16 | + values.sort((a, b) => b[0] - a[0]) |
| 17 | + const dp = {} |
| 18 | + |
| 19 | + return recur(values, 0, 0, dp) |
| 20 | +} |
| 21 | + |
| 22 | +function recur(values, idx, mask_row, dp) { |
| 23 | + const n = values.length |
| 24 | + if (idx === n) return 0 |
| 25 | + |
| 26 | + const key = `${idx},${mask_row}` |
| 27 | + if (key in dp) return dp[key] |
| 28 | + |
| 29 | + let ans = 0 |
| 30 | + const row = values[idx][1] |
| 31 | + if ((1 << row) & mask_row) { |
| 32 | + ans += recur(values, idx + 1, mask_row, dp) |
| 33 | + } else { |
| 34 | + let j = idx |
| 35 | + while (j < n && values[idx][0] === values[j][0]) j++ |
| 36 | + |
| 37 | + const ans1 = values[idx][0] + recur(values, j, mask_row | (1 << row), dp) |
| 38 | + const ans2 = recur(values, idx + 1, mask_row, dp) |
| 39 | + |
| 40 | + ans = Math.max(ans1, ans2) |
| 41 | + } |
| 42 | + |
| 43 | + dp[key] = ans |
| 44 | + return ans |
| 45 | +} |
0 commit comments