你將獲得k
個雞蛋,並可以使用一棟從1
到n
共有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層扔 如果碎了,那麼從第一層...