Stone Game VII
Last updated
Last updated
class Solution {
public int stoneGameVII(int[] stones) {
int[] prefixSum = new int[stones.length + 1];
for (int i = 0; i < stones.length; ++i) {
prefixSum[i + 1] = prefixSum[i] + stones[i];
}
int[][] dp = new int[stones.length][stones.length];
for (int i = 0; i < stones.length; ++i) {
dp[i][i] = 0;
}
for (int l = 1; l <= stones.length; ++l) {
for (int i = 0; i + l < stones.length; ++i) {
int j = i + l;
dp[i][j] = Math.max(
prefixSum[j + 1] - prefixSum[i + 1] - dp[i + 1][j],
prefixSum[j] - prefixSum[i] - dp[i][j - 1]);
}
}
// for (int i = 0; i < stones.length; ++i) {
// System.out.println(Arrays.toString(dp[i]));
// }
return dp[0][stones.length - 1];
}
}class Solution {
public int stoneGameVII(int[] stones) {
int[][] cache = new int[1000][1000];
for (int i = 0; i < cache.length; ++i) {
Arrays.fill(cache[i], Integer.MAX_VALUE);
}
return getMaxDiff(stones, 0, stones.length - 1, cache);
}
private int getMaxDiff(int[] arr, int left, int right, int[][] cache) {
if (left == right) return 0;
if (cache[left][right] != Integer.MAX_VALUE) {
return cache[left][right];
}
int maxDiff = Math.max(
sum(arr, left, right - 1) - getMaxDiff(arr, left, right - 1, cache),
sum(arr, left + 1, right) - getMaxDiff(arr, left + 1, right, cache)
);
cache[left][right] = maxDiff;
return maxDiff;
}
private int sum(int[] arr, int left, int right) {
int ret = 0;
for (int i = left; i <= right; ++i) {
ret += arr[i];
}
return ret;
}
}