一、n層樓2個雞蛋問題
題目描述:有兩個軟硬程度一樣但未知的雞蛋,它們有可能都在一樓就摔碎,也可能從一百層樓摔下來沒事。有座100層的建築,要你用這個雞蛋通過最少的次數確定哪一層是雞蛋可以安全落下的最高位置。可以摔碎兩個雞蛋。
分析:看到這個題目,最保險的方法就是從第一層往上一層一層試驗,但這樣就需要乙個雞蛋就可以了。我們現在有兩個雞蛋,完全可以用更快的方法。
進一步可以試驗的方法是二分查詢,例如:第乙個雞蛋從50層扔下,如果碎了,第二個雞蛋就從1到49一層一層試驗;如果沒碎,將區間縮小為50~100,將第乙個雞蛋從75層扔下,如果碎了,第二個雞蛋從51到74一層一層試驗...。但是這個方法有乙個缺點那就是考慮這樣一種情況:正好49就是要求的最高安全樓層,這時你將第乙個雞蛋從50層摔下去,碎了。第二個雞蛋就要從1到49層逐層檢驗,效果很差。
我們換個角度思考,從樓層的角度出發。嘗試用動態規劃的方法,找到構成這個最優問題的最優子問題。用dp[n]表示當樓層一共有n層時,找到安全位置的最小次數。當樓層為n時,假設我們一開始將第1個雞蛋從第i層開始扔(顯然1<=i<=n),如果第乙個雞蛋碎了,那麼第二個雞蛋必須從第1層到i-1層逐層檢驗,這樣的話最壞情況下要測試1+i-1=i次。假設第乙個雞蛋沒碎,那麼問題就轉化為找出樓層從i~n的安全位置,f(n)問題轉化為f(n-i)的問題,此時最壞情況下要測試1+f(n-i)次。
所以狀態轉移方程為:f(n) = min(max(1, 1+f(n-1)), max(2, 1+f(n-2), ... ,
max(i, 1+f(n-i)),..., max(n-1, 1+f(1))));
其中f(1)=1
例題:
某幢大樓有100層。你手裡有兩顆一模一樣的玻璃珠。當你拿著玻璃珠在某一層往下扔的時候,一定會有兩個結果,玻璃珠碎了或者沒碎。這幢大樓有個臨界樓層。低於它的樓層,往下扔玻璃珠,玻璃珠不會碎,等於或高於它的樓層,扔下玻璃珠,玻璃珠一定會碎。玻璃珠碎了就不能再扔。現在讓你設計一種方式,使得在該方式下,最壞的情況扔的次數比其他任何方式最壞的次數都少。也就是設計一種最有效的方式。
**:
#include#include#includeusingnamespace std;
intcalfloor(int n) }}
return dp[n];}
int main()
int main()
}
輸入:
輸入資料為一行,包括兩個複數n和m(0
輸出:
對於每組測試用例,要求輸出最少試驗次數。
樣例輸入:
100 3
樣例輸出:9
**:
#include#include#includeusingnamespace std;
intcalcthrownumber(int numoffloors, int numofballs)
//dp[egg][num]形式
vector>dp(numofballs + 1, vector(numoffloors + 1, 0));
//初始化
for (int i = 1; i <= numofballs; i++)
}for (int i = 2; i <= numofballs; i++)}}
return dp[numofballs][numoffloors]; }
int main()
return 0;
}
注意:這種解法的時間複雜度太大,並沒有ac,只過了88%的測試用例。
優化版本的**
#include using namespace std;
vector> dp(10000 + 1, vector(10000 + 1, -1));
void init()
for(int i = 1; i < dp[0].size(); i++)
}int calcthrownumber(int numoffloors, int numofballs)
dp[floor][balls] = step + 1;}}
return dp[numoffloors][numofballs];
}int main()
}
樓層扔雞蛋問題
有限層數和蛋數,求即使最壞情況下需要的最少判斷次數 兩個軟硬程度一樣但未知的雞蛋,它們有可能都在一樓就摔碎,也可能從一百層樓摔下來沒事。有座100層的建築,要你用這兩個雞蛋確定哪一層是雞蛋可以安全落下的最高位置。可以摔碎兩個雞蛋。參見 兩個雞蛋 一道google面試題 這是典型的動態規劃問題。假設f...
樓層扔雞蛋問題
兩個軟硬程度一樣但未知的雞蛋,它們有可能都在一樓就摔碎,也可能從一百層樓摔下來沒事。有座100層的建築,要你用這兩個雞蛋確定哪一層是雞蛋可以安全落下的最高位置。可以摔碎兩個雞蛋。參見兩個雞蛋 一道google面試題 這是典型的動態規劃問題。假設f n 表示從n層樓找到摔雞蛋不碎安全位置的最少判斷次數...
樓層扔雞蛋問題
有限層數和蛋數,求即使最壞情況下需要的最少判斷次數 兩個軟硬程度一樣但未知的雞蛋,它們有可能都在一樓就摔碎,也可能從一百層樓摔下來沒事。有座100層的建築,要你用這兩個雞蛋確定哪一層是雞蛋可以安全落下的最高位置。可以摔碎兩個雞蛋。分析 這是典型的動態規劃問題。假設f n 表示從n層樓找到摔雞蛋不碎安...