思路
方法一 動態規劃
第一步:定義數組元素的含義
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;
}
};