難度easy
愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。
最初,黑板上有乙個數字 n 。在每個玩家的回合,玩家需要執行以下操作:
選出任一 x,滿足 0 < x < n 且 n % x == 0 。
用 n - x 替換黑板上的數字 n 。
如果玩家無法執行這些操作,就會輸掉遊戲。
只有在愛麗絲在遊戲中取得勝利時才返回 true,否則返回 false。假設兩個玩家都以最佳狀態參與遊戲。
class
solution
:def
divisorgame
(self, n:
int)
->
bool
:if n ==1:
return
false
dp =[0
for _ in
range
(n+1)]
dp[2]
=1for i in
range(3
,n+1):
for j in
range(1
, i//2+
1):if i%j ==
0and dp[i-j]==0
: dp[i]=1
return dp[n]
==1
經典的動態規劃題目,建立乙個列表記錄輸入不同n時愛麗絲的輸贏情況。
顯而易見n=1時愛麗絲輸,n=2時愛麗絲贏。
依次往後推導,狀態轉移方程可以理解為:當輸入為i時,它的任何非本身約數j,由於假設兩個玩家都以最佳狀態參與遊戲,若存在這樣的j,愛麗絲選擇了j後鮑勃必輸(dp[i-j]=0),那麼輸入i時愛麗絲必勝(dp[i]=1)。經過一次遍歷後便得出dp[n]
通過頭腦風暴可以發現輸入為偶數時愛麗絲必贏,奇數時必輸。因為輸入奇數時,鮑勃每次都取1,按這種策略最後剩給愛麗絲的一定是1,愛麗絲輸。輸入偶數時,愛麗絲每次都取1,最後剩給鮑勃的一定是1,愛麗絲贏。
總的來說,這是一道思路非常清晰的簡單動態規劃題,關鍵是狀態轉移矩陣有點抽象,具有一定思維技巧。
動態規劃系列 1025 除數博弈
package test 動態規劃系列 1025.除數博弈 愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。最初,黑板上有乙個數字 n 在每個玩家的回合,玩家需要執行以下操作 選出任一 x,滿足 0 x n 且 n x 0 用 n x 替換黑板上的數字 n 如果玩家無法執行這些操作,就會輸掉遊...
1025 除數博弈
愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。最初,黑板上有乙個數字n。在每個玩家的回合,玩家需要執行以下操作 如果玩家無法執行這些操作,就會輸掉遊戲。只有在愛麗絲在遊戲中取得勝利時才返回true,否則返回false。假設兩個玩家都以最佳狀態參與遊戲。示例 1 輸入 2 輸出 true 解釋...
1025 除數博弈
label 博弈,數學問題,dp 愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。最初,黑板上有乙個數字 n 在每個玩家的回合,玩家需要執行以下操作 選出任一 x,滿足 0 x n 且 n x 0 用 n x 替換黑板上的數字 n 如果玩家無法執行這些操作,就會輸掉遊戲。只有在愛麗絲在遊戲中取...