题目
Alice 和 Bob 继续他们的石子游戏。几堆石子 排成一行 ,每堆石子都对应一个得分,由数组 stoneValue 给出。
Alice 和 Bob 轮流取石子,Alice 总是先开始。在每个玩家的回合中,该玩家可以拿走剩下石子中的的前 1、2 或 3 堆石子 。比赛一直持续到所有石头都被拿走。
每个玩家的最终得分为他所拿到的每堆石子的对应得分之和。每个玩家的初始分数都是 0 。
比赛的目标是决出最高分,得分最高的选手将会赢得比赛,比赛也可能会出现平局。
假设 Alice 和 Bob 都采取 最优策略 。
如果 Alice 赢了就返回 "Alice" *,Bob 赢了就返回"Bob",*分数相同返回 "Tie" 。
链接
思考
优胜思想,专注接下来每个选择带来的净数
代码
class Solution {
public String stoneGameIII(int[] stoneValue) {
int n = stoneValue.length;
int[] dp = new int[n + 1]; // dp[n] = 0 是边界
// 从后往前填
for (int i = n - 1; i >= 0; i--) {
dp[i] = Integer.MIN_VALUE; // 先设为负无穷
int sum = 0;
for (int j = 0; j < 3 && i + j < n; j++) {
sum += stoneValue[i + j];
dp[i] = Math.max(dp[i], sum - dp[i + j + 1]);
}
}
if (dp[0] > 0) return "Alice";
else if (dp[0] < 0) return "Bob";
else return "Tie";
}
}
