數學方法
參考:
關於高樓扔雞蛋問題,本文只對動態規劃方法進行概括性的描述,具體看這裡。
k個雞蛋 n 層樓,問至少嘗試多少次可以找到雞蛋不碎的臨界樓層,求最少次數m
設dp[k][n] 表示k個雞蛋n層樓要嘗試的最少次數·dp[k][n] = min1
≤x≤n
\min_
min1≤x
≤n(max(dp[k-1][x-1], dp[k][n-x]))
dp[k-1][x-1]遞增,dp[k][n-x]遞減,dp[k][n]相當於取谷底,可以二分
設dp[k][m] 表示k個雞蛋嘗試m次可以確定的最大層數·dp[k][m] = dp[k][m-1] + dp[k-1][m-1] + 1
dp[k][m-1] :雞蛋沒碎,樓下k個蛋嘗試m-1次可以確定的最大層數
dp[k-1][m-1] :雞蛋碎了,樓上k-1個蛋嘗試m-1次可以確定的最大層數
·可以進一步壓縮空間,因為本次答案只和上次的m-1有關,可以壓縮成一維的
dp[k] = dp[k] + dp[k-1] + 1
vectorint>>
dp(k+
1, vector<
int>
(n+1,0
));int m =0;
while
(dp[k]
< n)
return m;
觀察上述方案2的方程,為了下面方便表示,換一下表示形式f(m,k) = dp[k][m]
,
設g(m,k) = f(m,k)-f(m,k-1)
,則:
g (m
,k)=
f(m,
k)−f
(m,k
−1)=
f(m−
1,k)
+f(m
−1,k
−1)+
1−(f
(m−1
,k−1
)+f(
m−1,
k−2)
+1)=
g(m−
1,k)
+g(m
−1,k
−1
)\begin g(m,k) &= f(m,k)-f(m,k-1) \\ &= f(m-1,k) + f(m-1,k-1)+1-(f(m-1,k-1) + f(m-1,k-2)+1) \\ &= g(m-1,k)+g(m-1,k-1) \end
g(m,k)
=f(
m,k)
−f(m
,k−1
)=f(
m−1,
k)+f
(m−1
,k−1
)+1−
(f(m
−1,k
−1)+
f(m−
1,k−
2)+1
)=g(
m−1,
k)+g
(m−1
,k−1
)??? 是否有些許熟悉,楊輝三角??? 用ar,
ca_
ar,c
表示楊輝三角中第 r 行第 c 列的元素,它的值又是二項式係數 crc
c_^cr
c,即:ar,
c=ar
−1,c
+ar−
1,c−
1=cr
ca_ = a_ + a_ = c_^
ar,c=
ar−1
,c+
ar−1
,c−1
=cr
c所以 :
g (m
,k)=
cmk+
1f(m
,k)=
∑1≤x
≤kg(
m,x)
=∑cm
x\begin g(m,k) &= c_m^ \\ f(m,k) &= \sum_g(m,x) = \sum c_^ \end
g(m,k)
f(m,
k)=
cmk+
1=1
≤x≤k
∑g(
m,x)
=∑cm
x從另一種角度理解這個公式:
k個蛋嘗試m次,每次選樓層的的結果就是碎或不碎(1/0),所以不管選那一層,最後的方案就是乙個長度為m的01序列,碎了0次的方案數就是cm0現在的目標轉化為找最小的 m 使得 f(mc_m^0
cm0
,碎了一次的就是cm1
c_m^1
cm1
……,總方案數就是 ∑1≤
x≤kc
mx
\sum_c_m^x
∑1≤x≤k
cmx
,k)≥
nf(m,k) \ge n
f(m,k)
≥n,可以二分尋找 m
class
solution
return l;
}public
intf
(int x,
int k,
int n)
return ans;
}}
高樓扔雞蛋
雞蛋數量為m,高樓層數為n,使用最小次數p去找到扔下雞蛋會碎的最小層數 首先第0層,則p 0 雞蛋數量m 0時,則p無法計算,也預設為p 0 然後第1層,則p 1 雞蛋數量m 1時,則最壞情況 p n 可以假設從k層扔下,倘若碎了,題目就變成了雞蛋數量為m 1,樓層則變為了k 1,扔蛋最小次數p 1...
數學回味系列之10 高樓扔雞蛋
問題提出 有座100層的建築,雞蛋從某一層扔下來有可能摔碎 可能是,也可能是 你手上有兩個軟硬程度一樣的雞蛋,要判斷出來哪一層是雞蛋可以安全落下的最高位置。最少需要扔多少次?解題思路 最笨的方法,從1層開始,每層都扔1次,直到摔碎 為止,得到當前當前層數 n。最差需要100次 好像只需要乙個雞蛋就夠...
C 演算法集錦(12) 高樓扔雞蛋
我有一籮筐的雞蛋,我可以給你兩個。我有一棟一百層的樓,我想讓你站在第一百層,以最少的次數幫我測出來雞蛋最多扔到哪一層不會碎。你放心扔,如果沒碎,不用去撿,我直接補給你乙個。事成之後,這張支票你隨便填。佰 拾 圓咋樣,有什麼想法嗎?我說說我的想法,首先,第二個雞蛋肯定一層一層扔啊 不是兩層兩層扔 那第...