石子游戏
class Solution {
public String stoneGameIII(int[] stoneValue) {
int n = stoneValue.length;
int[] suffixSum = new int[n];
suffixSum[n - 1] = stoneValue[n - 1];
//求后缀和
for (int i = n - 2; i >= 0; --i) {
suffixSum[i] = suffixSum[i + 1] + stoneValue[i];
}
//f(i):玩家能获得剩下的的i 到 n堆石子的最大数目
int[] f = new int[n + 1];
// 边界情况,当没有石子时,分数为 0
// 为了代码的可读性,显式声明
f[n] = 0;
//状态转移方程f(i) = sum(i,n-1) - maxf(j) [j = i+1,i+2,i+3]
for (int i = n - 1; i >= 0; --i) {
int bestj = f[i + 1];
for (int j = i + 2; j <= i + 3 && j <= n; ++j) {
bestj = Math.min(bestj, f[j]);
}
f[i] = suffixSum[i] - bestj;
}
int total = 0;
for (int value : stoneValue) {
total += value;
}
if (f[0] * 2 == total) {
return "Tie";
} else {
return f[0] * 2 > total ? "Alice" : "Bob";
}
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/stone-game-iii/solution/shi-zi-you-xi-iii-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。