1
var stoneGameV = function (stoneValue) {
2
// Find the stoneValue array's prefix sum
3
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);
6
}
7

8
let dp = Array(stoneValue.length)
9
.fill()
10
.map(() => Array(stoneValue.length).fill(0));
11

12
function game(start, end) {
13
if (dp[start][end]) return dp[start][end];
14
if (start === end) return 0;
15

16
let max = 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);
20
if (sumL > sumR) {
21
max = Math.max(max, sumR + game(i, end));
22
} else if (sumL < sumR) {
23
max = Math.max(max, sumL + game(start, i - 1));
24
} else {
25
// If tied, check both rows
26
let left = sumR + game(i, end);
27
let right = sumL + game(start, i - 1);
28
max = Math.max(max, left, right);
29
}
30
}
31
return (dp[start][end] = max);
32
}
33

34
return game(0, stoneValue.length - 1);
35
};

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0