動態規劃 1025 除數博弈

2021-10-09 10:09:10 字數 1059 閱讀 5070

難度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 如果玩家無法執行這些操作,就會輸掉遊戲。只有在愛麗絲在遊戲中取...