妙 高樓扔雞蛋的數學解法

2021-10-08 14:48:30 字數 2812 閱讀 5038

數學方法

參考:

關於高樓扔雞蛋問題,本文只對動態規劃方法進行概括性的描述,具體看這裡。

k個雞蛋 n 層樓,問至少嘗試多少次可以找到雞蛋不碎的臨界樓層,求最少次數m

設dp[k][n] 表示k個雞蛋n層樓要嘗試的最少次數

·dp[k][n] = min⁡1

≤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

c_m^0

cm0​

,碎了一次的就是cm1

c_m^1

cm1​

……,總方案數就是 ∑1≤

x≤kc

mx

\sum_c_m^x

∑1≤x≤k

​cmx

現在的目標轉化為找最小的 m 使得 f(m

,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) 高樓扔雞蛋

我有一籮筐的雞蛋,我可以給你兩個。我有一棟一百層的樓,我想讓你站在第一百層,以最少的次數幫我測出來雞蛋最多扔到哪一層不會碎。你放心扔,如果沒碎,不用去撿,我直接補給你乙個。事成之後,這張支票你隨便填。佰 拾 圓咋樣,有什麼想法嗎?我說說我的想法,首先,第二個雞蛋肯定一層一層扔啊 不是兩層兩層扔 那第...