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