愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。
最初,黑板上有一個數字 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]