描述
有 n 个不同价值的硬币排成一条线。两个参赛者轮流从 左边 依次拿走 1 或 2 个硬币,直到没有硬币为止。计算两个人分别拿到的硬币总价值,价值高的人获胜。
请判定 先手玩家 必胜还是必败?
若必胜, 返回 true, 否则返回 false.
样例
- 样例 1:
输入: [1, 2, 2]
输出: true
解释: 先手玩家直接拿走两颗硬币即可.
- 样例 2:
输入: [1, 2, 4]
输出: false
解释: 无论先手拿一个还是两个, 后手可以拿完, 然后总价值更高.
解析
firstWillWin = function (values) {
n = values.length;
f = [];
f[n] = 0; // 0 coins left
f[n - 1] = values[n - 1]; // only last coin left
for (i = n - 2; i >= 0; i--){
f[i] = Math.max(values[i] - f[i + 1], values[i] + values[i + 1] - f[i + 2]);
}
return f[0] >=0;
}