375 猜數字大小 II

2021-08-22 19:39:23 字數 1519 閱讀 6872

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

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

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

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

示例:

n = 10, 我選擇了8.

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

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

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

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

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

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

那麼我們需要建立乙個二維的dp陣列,其中dp[i][j]表示從數字i到j之間猜中任意乙個數字最少需要花費的錢數,那麼我們需要遍歷每一段區間[j, i],維護乙個全域性最小值global_min變數,然後遍歷該區間中的每乙個數字,計算區域性最大值local_max = k + max(dp[j][k - 1], dp[k + 1][i]),這個正好是將該區間在每乙個位置都分為兩段,然後取當前位置的花費加上左右兩段中較大的花費之和為區域性最大值,為啥要取兩者之間的較大值呢,因為我們要cover所有的情況,就得取最壞的情況。然後更新全域性最小值,最後在更新dp[j][i]的時候看j和i是否是相鄰的,相鄰的話賦為i,否則賦為global_min。這裡為啥又要取較小值呢,因為dp陣列是求的[j, i]範圍中的最低cost,比如只有兩個數字1和2,那麼肯定是猜1的cost低,是不有點暈,沒關係,博主繼續來繞你。我們想,如果只有乙個數字,那麼我們不用猜,cost為0。如果有兩個數字,比如1和2,我們猜1,即使不對,我們cost也比猜2要低。如果有三個數字1,2,3,那麼我們就先猜2,根據對方的反饋,就可以確定正確的數字,所以我們的cost最低為2。如果有四個數字1,2,3,4,那麼情況就有點複雜了,那麼我們的策略是用k來遍歷所有的數字,然後再根據k分成的左右兩個區間,取其中的較大cost加上k。

當k為1時,左區間為空,所以cost為0,而右區間2,3,4,根據之前的分析應該取3,所以整個cost就是1+3=4。

當k為2時,左區間為1,cost為0,右區間為3,4,cost為3,整個cost就是2+3=5。

當k為3時,左區間為1,2,cost為1,右區間為4,cost為0,整個cost就是3+1=4。

當k為4時,左區間1,2,3,cost為2,右區間為空,cost為0,整個cost就是4+2=6。

綜上k的所有情況,此時我們應該取整體cost最小的,即4,為最後的答案,這就是極小化極大演算法,參見**如下:

class solution 

dp[j][i] = j + 1 == i ? j : global;

}return dp[1][n];

}};

375 猜數字大小 II

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

375 猜數字大小 II

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

375 猜數字大小 II

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