leetcode —— 1025. 除數博弈

愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。

最初,黑板上有一個數字 N 。在每個玩家的回合,玩家需要執行以下操作:

選出任一 x,滿足 0 < x < N 且 N % x == 0 。
用 N - x 替換黑板上的數字 N 。
如果玩家無法執行這些操作,就會輸掉遊戲。

只有在愛麗絲在遊戲中取得勝利時才返回 True,否則返回 false。假設兩個玩家都以最佳狀態參與遊戲。

示例 1:

輸入:2
輸出:true
解釋:愛麗絲選擇 1,鮑勃無法進行操作。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/divisor-game
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
——————————
解題思路:使用動態規劃,dp[i]表示當N=i時,愛麗絲是勝利還是失敗的情況。

對於dp[i],dp[1]到dp[i-1]的情況都是已知的,所以取j從1遍歷到i-1,如果i%j==0同時dp[j]==False,那麼在dp[i]的情況下愛麗絲是肯定勝利的,因爲愛麗絲可以從i跳到j,因爲dp[j]=False,所以輪到鮑勃的時候鮑勃是失敗的。

因此可以得到狀態轉移方程:

for j in range(1,i):
    if i%j==0 and dp[j]==False:
        dp[i] = True
        break

最後我們只需要返回最終的dp[N]就可以了。其Python代碼如下:

class Solution:
    def divisorGame(self, N: int) -> bool:
        if N==1:  # 特殊情況
            return False
            
        lists = [False for _ in range(N+1)]  # 用於保存前面的狀態
        lists[2] = True
        for i in range(3,N+1):
            for j in range(1,i):
                if i%j==0 and lists[i-j]==False:
                    lists[i] = True
                    break
        return lists[N]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章