我們正在玩猜數遊戲, 遊戲內容如下:
我在 1到 n 的範圍內選擇乙個數作為待猜的數, 你需要來猜這個數,
每次你猜錯的時候, 我會告訴你我選擇的這個數是比你說的數要高還是低,
但是, 當你猜這個數為 x 並且猜錯的時候你需要支付 $x. 當你猜到我選擇的數時, 你將贏得這場遊戲
樣例給出 n = 10, 我選擇待猜數為 8
第一輪: 你猜測為 5, 我告訴你待猜的值要更大一些. 你需要支付 $5
第二輪: 你猜測為 7, 我告訴你待猜的值要更大一些. 你需要支付 $7
第三輪: 你猜測為 9, 我告訴你待猜的值要更小一些. 你需要支付 $9
遊戲結束. 8 是我選擇的待猜數.
你最終需要支付 $5 + $7 + $9 = $21
給乙個具體的大於等於 1 的數 n, 計算你需要多少錢才可以保證贏.
所以當 n = 10 時, 返回 16.
思路:動態規劃,這個猜數遊戲可以從小到大進行推廣,比如現在我知道的數字所在區間大小為1,比如在[1,1]之中,那麼不需要任何付出就能猜到數字,即pay=0;
若數字區間大小為2,比如[n,n+1],我們只需要猜測該數為n,根據結果就能猜中最後的數字,所以我們最多付出pay=n即可猜中數字;
當區間為3,[n,n+2],我們只需猜n+1就一定能直接確定,此時付出為pay = n+1;
...推廣到區間為大小為m+1時,即區間[n,n+m]時可以得到遞推式:dp[n][n+m] = min(max(dp[n][x-1],dp[x+1]) + x) 其中ndp[i][j]表示在i-j的數字裡面猜中數字所需要的最少付出。
按照這個遞推公式使用動態規劃就能得到解,最後返回dp[1][n]。
1class
solution ;
14 dp[n][n] = 0;15
for(int range = 2; range//
range表示區間大小
16for(int i = 1;ii)21}
22}23}
24return dp[1
][n];25}
26 };
LintCode 662 猜數遊戲 C
我們正在玩猜數遊戲。遊戲如下 我從 1 到 n 選擇乙個數字。你需要猜我選擇了哪個號碼。每次你猜錯了,我會告訴你這個數字是高還是低。你呼叫乙個預定義的介面 guess int num 它會返回 3 個可能的結果 1,1或0 forward declaration of guess api.param...
1995猜數遊戲
猜數遊戲 time limit 1 seconds memory limit 32768 k total submit 70 accepted 11 description 我們經常看到這樣的遊戲,機器隨機產生乙個4個不同的數字,然後你輸入4個不同數字,然後機器自動判斷你輸入的4個數字有多少個數字猜...
簡單猜數遊戲
2.計算機隨機生成乙個1024之內的整數,請你猜這個數,如果猜錯了,計算機會提示你大了還是小了,你一共只有十次機會,如果十次沒猜到 則提示 失敗 如果十次之內猜對則提示 你真聰明 c using system using system.collections.generic using system...