扔雞蛋 (動態規劃)

2021-09-24 06:45:49 字數 1496 閱讀 6514

你將獲得k個雞蛋,並可以使用一棟從1n共有n層樓的建築。

每個蛋的功能都是一樣的,如果乙個蛋碎了,你就不能再把它掉下去。

你知道存在樓層f,滿足0 <= f <= n任何從高於f的樓層落下的雞蛋都會碎,從f樓層或比它低的樓層落下的雞蛋都不會破。

你的目標是確切地知道f的值是多少。

無論f的初始值如何,你確定f的值的最小移動次數是多少?

/*  不能簡單的用二分法: eg: 如果只有兩個蛋 第乙個碎了之後第二個應該盡可能謹慎 如從第一層重新開始

* 顯然 蛋越多(足夠多)可以用二分 即最短的移動步數最好在最後一步移動時碎掉所有的蛋

* 方法1: dp[n][k] 為剩餘k個蛋去探測n層樓最少的步數 dp[i][1]=i

* 考慮在第i層仍(反正要遍歷)分為兩種情況 (具體步數根當前情況有關 但是要考慮最壞的情況 就取下面最大的)

* 1. 沒碎 dp[n-i][k]

* 2. 碎了 dp[i-1][k-1]

* * 考慮最壞的情況 即: max(dp[n-i][k], dp[i-1][k-1])+1 1是當前這一步

* 注意這裡是考慮仍在第i層 因此會有乙個最好的情況出現

* dp[n][k] = min (1 <= i <= n)

* */

class solution

// 注意 這裡dp[n][k]一定要理解為用k個蛋去探測n層(而非第n層)

for(int j=2;j<=k;j++)}}

return dp[n][k];

}};

/*  

* 思路2: 求k個雞蛋在m步內最多測出來的層數

* dp[m][k]

* 假設當前站在第i層 仍乙個蛋 碎了則可以測dp[m-1][k-1](向本層以下測)

* 沒碎可以測 dp[m-1][k](向本層以上測)

* 加上本層這個雞蛋也可以定一層?

* dp[m][k] = dp[m-1][k-1]+dp[m-1][k]+1

* 甚至可以優化空間複雜度(用到的都是dp[m-1]這種)注意這裡是k-1所以迴圈順序注意下

* */

class solution

}return m;

}};

高樓扔雞蛋問題 動態規劃 反推演繹

對於高樓扔雞蛋問題,本文嘗試反其道而行之 首先描述乙個普適的高樓扔雞蛋問題,然後利用動態規劃法解決扔雞蛋次數的問題,最後由獲取次數的答案反推出扔雞蛋的方法。這種由次數答案反推出方法的演繹方式令人有點震驚,似乎不同於常見的人類思考方式,有點像 先假設再證明 一樣。感覺這個題目還有繼續深挖的可能,比如找...

樓層扔雞蛋

有限層數和蛋數,求即使最壞情況下需要的最少判斷次數 兩個軟硬程度一樣但未知的雞蛋,它們有可能都在一樓就摔碎,也可能從一百層樓摔下來沒事。有座100層的建築,要你用這兩個雞蛋確定哪一層是雞蛋可以安全落下的最高位置。可以摔碎兩個雞蛋。參見 兩個雞蛋 一道google面試題 這是典型的動態規劃問題。假設f...

扔雞蛋問題

因為就乙個雞蛋,所以,我們很容易就可以想到從第一層開始扔就可以了,直到碎,說明這是n 1層。這裡當然也可以按照第乙個問題的方法來實現,即從第一層開始向上,直到摔碎為止,但是這種方法顯然是低效的。方法二 二分查詢 當時就想到了使用這種方法,即採用二分查詢的思路,第一次在50層扔 如果碎了,那麼從第一層...