利用一个数组来存储获得先手的每个数字是赢或者输,后面的比赛就可以参考前面的了。
class Solution {
public:
bool divisorGame(int n) {
if(n==1) return false;
// 用来记录每个数是赢还是输(获得先手)
vector<bool> vec(n-1);
// 当数字为1时,肯定是爱丽丝输
vec[0] = false;
// 然后判断每个获得先手的数是赢或者输,填充vec
for(int i=2; i<=n; i++)
{
// 爱丽丝先手选出任意一个数 x
for(int x=1; x<i; x++)
{
// 判断这个数是否能被x整除
// 如果能够整除,那么x作为一个选择对象
if(i%x==0)
{
// 爱丽丝选择这个x,则鲍勃获得先手数字i-x,只需要判断这个先手数字赢或者输
// 如果鲍勃获得的这个先手数字赢,则爱丽丝输;如果这个先手数字输,则爱丽丝赢
vec[i-1] = !vec[i-x-1];
// 只要可以赢就立马赢,不用再往后试,否则要将所有可以整除的数都试一遍
if(vec[i-1] == true)
break;
}
}
}
return vec[n-1];
}
};