思路
方法一 动态规划
第一步:定义数组元素的含义
dp[n]
:数字为n时,此时取数字者的游戏结果
第二步:找出关系数组元素间的关系时
假设Alice的dp[i]=false
;
如果Alice取某个数字后,能使得Bob一定为false
,则此时Alice一定胜
第三步:找出初始值
在n=1
时,Alice先取,一定无法获胜dp[1]=false
;
在n=2
时,Alice先取,一定可以获胜 dp[2]=true
;
代码
class Solution {
public:
bool divisorGame(int N) {
//初始化
vector<bool> dp(N+1);
//base case
dp[1] = false;
dp[2] = true;
//状态转移
for (int i=3;i<=N;i++)
{
dp[i] = false;
for (int j=1;j<i;j++)
{
if ((i%j==0)&&!dp[i-j])//所取的数复合条件,且取完该数后,Bob在i-j数的游戏结果为false,则此时alice的游戏结果为true
{
dp[i] = true;
break;
}
}
}
return dp[N];
}
};
方法二 数学法
class Solution {
public:
bool divisorGame(int N) {
return N%2==0;
}
};