力扣解題思路 464 我能贏嗎

2021-10-12 16:45:53 字數 815 閱讀 4030

思路:

乍一看又像是腦筋急轉彎的題目,但是看標籤發現竟然可以用動態規劃,這個我覺得很難理解,看題解裡有乙個用遞迴寫的,我覺得思路不錯,記錄一下:

public

boolean

caniwin

(int maxchoosableinteger,

int desiredtotal)

public

boolean

canwin

(int chooseable,

int nowtarget,

int used,map

map)}}

map.

put(used,

false);

return

false

;}

其主要**部分就是記憶化遞迴,首先遍歷所有的數作為起始數,為了防止重複遍歷將所有數和對應結果儲存在map中,以後遇到就不用再次遞迴而可以直接使用結果。

另外很重要的一點是,在遞迴的每一條路徑上不可以使用重複的數字,為了記錄此路徑使用過的數字,他使用了乙個比較巧妙的方法,因為題目中說過maxchoosableinteger小於20<32,故可以用每一位代表該數是否被選用過(之前某個題目也使用過類似的思路)

但其實最巧妙的是這一句:

if

(nowtarget <= i ||

!canwin

(chooseable,nowtarget-i,used |(1

<

,map)

)

通過這一句直接判斷了對手的狀態,實在是很巧妙~

464 我能贏嗎

在 100 game 這個遊戲中,兩名玩家輪流選擇從 1 到 10 的任意整數,累計整數和,先使得累計整數和達到 100 的玩家,即為勝者。如果我們將遊戲規則改為 玩家不能重複使用整數 呢?例如,兩個玩家可以輪流從公共整數池中抽取從 1 到 15 的整數 不放回 直到累計整數和 100。給定乙個整數...

464 我能贏嗎

在 100 game 這個遊戲中,兩名玩家輪流選擇從 1 到 10 的任意整數,累計整數和,先使得累計整數和達到 100 的玩家,即為勝者。如果我們將遊戲規則改為 玩家不能重複使用整數 呢?例如,兩個玩家可以輪流從公共整數池中抽取從 1 到 15 的整數 不放回 直到累計整數和 100。給定乙個整數...

leetcode 464 我能贏嗎

題目 在 100 game 這個遊戲中,兩名玩家輪流選擇從 1 到 10 的任意整數,累計整數和,先使得累計整數和達到 100 的玩家,即為勝者。如果我們將遊戲規則改為 玩家不能重複使用整數 呢?例如,兩個玩家可以輪流從公共整數池中抽取從 1 到 15 的整數 不放回 直到累計整數和 100。給定乙...