leetcode第887題雞蛋掉落
題目描述:
思路1:
這個題的問題是:如何在最小的移動次數內確定雞蛋可以掉碎的最低樓層?很明顯這是乙個最優化問題,也就是求f(k,n)的最小值。既然時求最優解,我們就可以考慮使用動態規劃的方法來解。將情況分為以下幾種:
1、樓層數為0或者雞蛋數為0,那最少的移動次數就是0。f(0,n)=0,f(k,0)=0
2、雞蛋數為1,那就需要從第一層開始逐步向上扔,所以最少的移動次數為樓層數。f(1,n)=n
3、當樓層數大於0且雞蛋數大於1,假設有k個雞蛋,n層樓,我們首先從x層將雞蛋扔下,這是會有兩種情況:
(1)雞蛋碎了:那我們就排除了x層之上包括x的樓層,同時損失了一枚雞蛋。所以有1+f(k-1,x-1).
(2)雞蛋沒碎:那我們就排除了x層之下包括x的樓層,並且沒有損失雞蛋。所以有1+f(k,n-x).需要在這兩個值中選取較大的值(最壞的情況)。
而且題目要求:無論f
的初始值如何,你確定f
的值的最小移動次數是多少?這很明顯了x有關係,如果x取得好,那移動的次數就會少。所以需要使用窮舉的辦法將x從1-n逐一計算,其中的最小值就是答案。
動態規劃狀態轉化方程:
f(0,n)=0 //沒有樓層
f(k,0)=0 //沒有雞蛋
f(1,n)=n //只有乙個雞蛋
f(k,n)=min(1+max(f(k-1,x-1),f(k,n-x))) //x=1,2,3....
**實現:
#include #include using namespace std;
int maxstop(int x, int y)
int movestop(int floor, int eggs)
for (int i = 1; i <= floor; ++i)
}dp[i][j] = min;
} }return dp[floor][eggs];
}int main()
return 0;
}
這個演算法的時間複雜度過高o(m*m*n),o(m*n)。一旦資料過大,計算就會非常大。
優化:時間複雜度是由,狀態轉化方程決定的,在不改變狀態轉化方程的前提下是沒有辦法降低的,但空間複雜度是可以降低的。因為,雞蛋數隻和當前雞蛋數和上一層雞蛋數有關係,所以可以將,空間複雜度降為o(2*n).leetcode提交不過。
思路2:
將問題轉化為k個雞蛋在m步可以確定的最大樓層數。就是求f(k,m)<=n的最小值。
(1)雞蛋碎了:那麼步數和雞蛋數減1,所以只能向下尋找f(k-1,m-1)
(2)雞蛋沒碎:那麼步數減1,雞蛋數沒有變,所以可以向上尋找f(k,m-1).
動態規劃狀態轉化方程:
f(0,m)=0 //沒有雞蛋無法測試
f(k,0)=0 //沒有步數無法測試
f(1,m)=m //只有乙個雞蛋可以測試m層
f(k,m)=f(k,m-1)+f(k-1,m-1)+1 //向上尋找的層數+向下尋找的層數+本層
**:
#include #include using namespace std;
int maxfloor(int eggs, int step)
for (int i = 2; i <= eggs; ++i)
}} //最小可以確定step層
return step;
}int main()
雞蛋掉落(動態規劃)
問題 力扣演算法面試彙總 你的目標是確切地知道 f 的值是多少。無論 f 的初始值如何,你確定 f 的值的最小移動次數是多少?例子 輸入 k 1,n 2 輸出 2 解釋 雞蛋從 1 樓掉落。如果它碎了,我們肯定知道 f 0 否則,雞蛋從 2 樓掉落。如果它碎了,我們肯定知道 f 1 如果它沒碎,那麼...
leetcode 887 雞蛋掉落(動態規劃)
你將獲得 k 個雞蛋,並可以使用一棟從 1 到 n 共有 n 層樓的建築。每個蛋的功能都是一樣的,如果乙個蛋碎了,你就不能再把它掉下去。你知道存在樓層 f 滿足 0 f n 任何從高於 f 的樓層落下的雞蛋都會碎,從 f 樓層或比它低的樓層落下的雞蛋都不會破。你的目標是確切地知道 f 的值是多少。無...
雞蛋掉落問題
leetcode 887.雞蛋掉落 include include using namespace std intsupereggdropbs int k,int n 這一段改用二分查詢,而不從1列舉到i int start 1,end i,mid int res int max 可能存在找不到的情...