LeetCode 375 猜數字大小II

2021-09-29 12:48:46 字數 1559 閱讀 3151

我們正在玩乙個猜數遊戲,遊戲規則如下:

我從 1 到 n 之間選擇乙個數字,你來猜我選了哪個數字。

每次你猜錯了,我都會告訴你,我選的數字比你的大了或者小了。

然而,當你猜了數字 x 並且猜錯了的時候,你需要支付金額為 x 的現金。直到你猜到我選的數字,你才算贏得了這個遊戲。

示例:

n = 10, 我選擇了8.

第一輪: 你猜我選擇的數字是5,我會告訴你,我的數字更大一些,然後你需要支付5塊。

第二輪: 你猜是7,我告訴你,我的數字更大一些,你支付7塊。

第三輪: 你猜是9,我告訴你,我的數字更小一些,你支付9塊。

遊戲結束。8 就是我選的數字。

你最終要支付 5 + 7 + 9 = 21 塊錢。

給定 n ≥ 1,計算你至少需要擁有多少現金才能確保你能贏得這個遊戲。

看到猜數字,心想:二分查詢呀。後來發現,根本沒有目標值,傻眼了。

思路:花最少的現金數,也就是最優的路徑猜這道題。這題不是按照二分法,比如n=5,必須先猜4,如果4是猜小了,一定是5,只要4塊。如果猜4大了,再猜2,如果2也不對,下一次一定是1或3了,這樣花費最多是6塊。如果n=10,先猜7,再依據大小猜9或4,如果猜9再不對,那一定是8或10,花費7+9=16。如果是猜4不對再往下猜也不會超過16,所以如果是n=10,結果是16.

/**

dp[i][j]表示從[i,j]中猜出正確數字所需要的最少花費金額.(dp[i][i] = 0)

假設在範圍[i,j]中選擇x, 則選擇x的最少花費金額為: max(dp[i][x-1], dp[x+1][j]) + x

用max的原因是我們要計算最壞反饋情況下的最少花費金額(選了x之後, 正確數字落在花費更高的那側)

初始化為(n+2)*(n+2)陣列的原因: 處理邊界情況更加容易, 例如對於求解dp[1][n]時x如果等於1,

需要考慮dp[0][1](0不可能出現, dp[0][n]為0)

而當x等於n時, 需要考慮dp[n+1][n+1](n+1也不可能出現, dp[n+1][n+1]為0)

如何寫出相應的**更新dp矩陣, 遞推式dp[i][j] = max(max(dp[i][x-1], dp[x+1][j]) + x),

x~[i:j], 可以畫出矩陣圖協助理解, 可以發現

dp[i][x-1]始終在dp[i][j]的左部, dp[x+1][j]始終在dp[i][j]的下部, 所以更新dp矩陣時i的

次序應當遵循bottom到top的規則, j則相反, 由於i肯定小於等於j,

所以我們只需要遍歷更新矩陣的一半即可(下半矩陣)

**/

class solution ;

memset(dp, 0, sizeof(int) * (n+2)*(n+2));

for(int i = n; i >= 1; --i)}}

}return dp[1][n];}};

LeetCode375 猜數字大小 II

我們正在玩乙個猜數遊戲,遊戲規則如下 我從1到n之間選擇乙個數字,你來猜我選了哪個數字。每次你猜錯了,我都會告訴你,我選的數字比你的大了或者小了。然而,當你猜了數字 x 並且猜錯了的時候,你需要支付金額為 x 的現金。直到你猜到我選的數字,你才算贏得了這個遊戲。示例 n 10,我選擇了8.第一輪 你...

LeetCode 375 猜數字大小 II

我們正在玩乙個猜數遊戲,遊戲規則如下 我從 1 到 n 之間選擇乙個數字,你來猜我選了哪個數字。每次你猜錯了,我都會告訴你,我選的數字比你的大了或者小了。然而,當你猜了數字 x 並且猜錯了的時候,你需要支付金額為 x 的現金。直到你猜到我選的數字,你才算贏得了這個遊戲。示例 n 10,我選擇了8.第...

375 猜數字大小 II

我們正在玩乙個猜數遊戲,遊戲規則如下 我從1到n之間選擇乙個數字,你來猜我選了哪個數字。每次你猜錯了,我都會告訴你,我選的數字比你的大了或者小了。然而,當你猜了數字 x 並且猜錯了的時候,你需要支付金額為 x 的現金。直到你猜到我選的數字,你才算贏得了這個遊戲。示例 n 10,我選擇了8.第一輪 你...