【LeetCode】1025. 除數博弈

思路

方法一 動態規劃

第一步:定義數組元素的含義

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;
	}
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章