1
var stoneGameV = function (stoneValue) {2
// Find the stoneValue array's prefix sum3
let prefix = Array(stoneValue.length).fill(0);4
for (let i = 0; i < stoneValue.length; i++) {5
prefix[i] = stoneValue[i] + (prefix[i - 1] || 0);8
let dp = Array(stoneValue.length)10
.map(() => Array(stoneValue.length).fill(0));12
function game(start, end) {13
if (dp[start][end]) return dp[start][end];14
if (start === end) return 0;17
for (let i = start + 1; i <= end; i++) {18
let sumL = prefix[i - 1] - (prefix[start - 1] || 0);19
let sumR = prefix[end] - (prefix[i - 1] || 0);21
max = Math.max(max, sumR + game(i, end));22
} else if (sumL < sumR) {23
max = Math.max(max, sumL + game(start, i - 1));25
// If tied, check both rows26
let left = sumR + game(i, end);27
let right = sumL + game(start, i - 1);28
max = Math.max(max, left, right);31
return (dp[start][end] = max);34
return game(0, stoneValue.length - 1);