QUESTION:
Alice and Bob take turns playing a game, with Alice starting first.
Initially, there is a number N
on the chalkboard. On each player’s turn, that player makes a move consisting of:
- Choosing any
x
with0 < x < N
andN % x == 0
. - Replacing the number
N
on the chalkboard withN - x
.
Also, if a player cannot make a move, they lose the game.
Return True
if and only if Alice wins the game, assuming both players play optimally.
Example 1:
Input: 2
Output: true
Explanation: Alice chooses 1, and Bob has no more moves.
Example 2:
Input: 3
Output: false
Explanation: Alice chooses 1, Bob chooses 1, and Alice has no more moves.
Note:
1 <= N <= 1000
EXPLANATION:
这题的意思很明确了。就是两个人进行博弈,同时两者都是理性的。
那么就很简单了,不是A赢就是B赢。
那我们就可以用一个数组来记录A赢的情况,A赢的情况的反面其实就B赢。
那么[1] 是A输,那么就是false。
[2]我们可以怎么计算呢,那么就是A可以只取一个,那么这时候,就剩下了tmp[1]是false,那么B就必然是输了。所以[2]就是true。
[3]的情况我们可以考虑到就是没有办法只能是输,结果为false。
那么问题就可以转化为:A可不可以拿出一个数,正好是B输的情况。
SOLUTION:
class Solution {
public boolean divisorGame(int N) {
boolean[] temp = new boolean[N + 1];
temp[1] = false;
for (int i = 2; i <= N; i++) {//填充整个数组
for (int j = 1; j < i; j++) {//遍历可能的x的值
if (i % j == 0 && !temp[i - j]) {//如果x符合条件,既能整除,同时能让B输。
temp[i] = true;
break;
}
}
}
return temp[N];
}
}