Re: [問題] leetcode 464 can i win

看板Prob_Solve (計算數學 Problem Solving)作者 (可愛小孩子)時間7年前 (2017/05/17 17:19), 7年前編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/4 (看更多)
Retrograde Method: http://codepad.org/i3CsFKnT (Perl) 不知道有沒有寫錯 還請各位幫我看看 ※ 引述《powertodream (The Beginning)》之銘言: : https://leetcode.com/problems/can-i-win/#/description : 是兩個人互相取數字, 當第一個人取的數字超過目標, 就return true : 原本的想法是, player 1 挑全部沒選過的number, 然後 呼叫secondPlayerWin的 : function : 去判斷是不是有存在secondPlayer win的, 只要有存在A 選的這個number就是不行的 : 不過寫不太好的吃了個wrong answer, : 偷看看討論串解答 : 看了很多的作法, 都是做類似 : !helper(desiredTotal - i) : 的遞迴, : 想半天仍然不太懂... 有版友有興趣一起研究研究嗎? : 這個是原作者的解釋, 但是我仍然不懂他的意思, 為什麼code要寫成那樣 : ** : The strategy is we try to simulate every possible state. E.g. we let this : player choose any unchosen number at next step and see whether this leads to : a win. If it does, then this player can guarantee a win by choosing this : number. If we find that whatever number s/he chooses, s/he won't win the : game, then we know that s/he is guarantee to lose given such a state. : // try every unchosen number as next step : for(int i=1; i<used.length; i++){ : if(!used[i]){ : used[i] = true; : // check whether this lead to a win, which means : helper(desiredTotal-i) must return false (the other player lose) : if(!helper(desiredTotal-i)){ : map.put(key, true); : used[i] = false; : return true; : } : used[i] = false; : } : } : map.put(key, false); -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.221.80.36 ※ 文章網址: https://www.ptt.cc/bbs/Prob_Solve/M.1495012761.A.81D.html

05/18 00:58, , 1F
看不懂 可以分享想法嗎?
05/18 00:58, 1F
想法: 1. 用二進位做狀態編碼 Ex. MAX = 5, (5,4,1) ,則 state = 11001 (4,3,2,1),則 state = 01111 2. 一開始初始所有狀態值都是「輸型」(值為: 0) 3. 從最後一個狀態(所有數字都取的狀態)開始往前推 (Retrograde Method) 4. 當前狀態是輸型的話,則把當前狀態拿掉一個數字後(假設叫: 先前狀態) 設先前狀態為「贏型」(值為: 1) ps. 如果拿掉一個數字後(剩餘數字和) >= desiredTotal,略過不做事情 5. 當前狀態是贏型的話,略過不做事情 6. 最後看第一個狀態(所有數字都不取的狀態),是輸型還是贏型即可 ※ 編輯: cutekid (210.61.233.210), 05/18/2017 14:15:46
文章代碼(AID): #1P71MPWT (Prob_Solve)
討論串 (同標題文章)
文章代碼(AID): #1P71MPWT (Prob_Solve)