題目**,
兩個軟硬程度一樣但未知的雞蛋,它們有可能都在一樓就摔碎,也可能從一百層樓摔下來沒事。有座100層的建築,要你用這兩個雞蛋通過最少的次數確定哪一層是雞蛋可以安全落下的最高位置。可以摔碎兩個雞蛋
方法分析
看到這個題目,最保險的方法就是一層一層試驗,但這樣只需要乙個雞蛋就可以了。我們現在有兩個雞蛋,完全可以用有更快的方法。
進一步呢?可能試驗的方法是二分查詢,例如,第乙個雞蛋再50層扔下,如果碎了,第二個雞蛋從1-49逐層試驗;如果沒碎,第乙個雞蛋在75層扔下,如果碎了,第二個雞蛋從51-74逐層試驗…但是,這個方法,很容易悲劇,例如,當正好49層是可以安全落下的,需要嘗試50次。比只有乙個雞蛋的情況,效果還要差。
上面的分析都是從雞蛋的角度出發的,想要得到最少的嘗試次數,似乎比較難。那如果我們換個角度,從每個高度的樓層來看呢?如果,某個樓層是可以安全落下的,那麼最少需要多少次嘗試呢?看下面的分析
在我們程式設計解決問題的過程中,如果遇到最優問題的時候,往往可以先嘗試一下動態規劃的方法。而動態規劃的方法,首要的我們要找到構成這個最優問題的最優子問題。所以,下面的分析,我們首先嘗試動態規劃的方法,如何解決這個問題,這也是典型的程式設計師的思路;其次,在眾多的問題當中,有不少可以直接歸結為數學方程式,如果我們能夠寫出數學方程式,那麼,答案將是更加的簡潔、美妙。所以,第二個方法,將嘗試如果總結出數學方程式。
基於動態規劃的方法
前面提到,若要採用動態規劃的方法,最重要的是要找到子問題。做如下的分析,假設f表示從第n層樓扔下雞蛋,沒有摔碎的最少嘗試次數。第乙個雞蛋,可能的落下位置(1,n),第乙個雞蛋從第i層扔下,有兩個情況:
碎了,第二個雞蛋,需要從第一層開始試驗,有i-1次機會
沒碎,兩個雞蛋,還有n-i層。這個就是子問題了f 所以,當第乙個雞蛋,由第i個位置落下的時候,要嘗試的次數為1 + max(i - 1, f),那麼對於每乙個i,嘗試次數最少的,就是f的值。狀態轉移方程如下: f = min(1 + max(i - 1, f) ) 其中: i的範圍為(1, n), f = 1 完畢。
**如下:
int twoegg(int n)
} return dp[n];
}
推廣
動態規劃的方法,可以推廣為n層樓,m個雞蛋。如下分析: 假設f表示n層樓、m個雞蛋時找到最高樓層的最少嘗試次數。當第乙個雞蛋從第i層扔下,如果碎了,還剩m-1個雞蛋,為確定下面樓層中的安全樓層,還需要f次,找到子問題;不碎的話,上面還有n-i層,還需要f[n-i,m]次,又乙個子問題。 狀態轉移方程如下: f = min(1 + max(f, f) ) 其中: i為(1, n), f = 1
**如下:
int megg(int n,int m)//n個層,m個雞蛋
memset(dp[0],0,sizeof(int)*(m+1));
for(i=1;i<=n;i++)dp[i][1] = i;//初始化
for(i=1;i<=n;i++)//每一層
}} int res = dp[n][m];
for(i=0;i<=n;i++)delete dp[i];
delete dp;
return res;
}
基於數學方程的方法
假設最少嘗試次數為x,那麼,第乙個雞蛋必須要從第x層扔下,因為:如果碎了,前面還有x - 1層樓可以嘗試,如果沒碎,後面還有x-1次機會。如果沒碎,第乙個雞蛋,第二次就可以從x +(x - 1)層進行嘗試,為什麼是加上x - 1,因為,當此時,第乙個雞蛋碎了,第二個雞蛋還有可以從x+1 到 x + (x - 1) - 1層進行嘗試,有x - 2次。如果還沒碎,那第乙個雞蛋,第三次從 x + (x - 1) + (x - 2)層嘗試。碎或者沒碎,都有x - 3次嘗試機會,依次類推。那麼,x次的最少嘗試,可以確定的最高的樓層是多少呢? x + (x - 1) + (x - 2) + … + 1 = x(x+1) / 2 那反過來問,當最高樓層是100層,最少需要多少次呢?x(x+1)/2 >= 100, 得到x>=14,最少要嘗試14次。
待字閨中之巧妙排序分析
排序只有1,2,3三個元素的陣列,不能統計1,2,3的個數。分析 這個題目,儘管也是排序,但卻不能使用快速排序的方法。只有三個元素,如果時間複雜度仍舊是o nlogn 顯然不是最好的。那就可以使用線性的排序演算法,例如計數排序,可是題目中要求,不能夠對1,2,3進行統計個數。那該如何處理呢?請大家看...
待字閨中之巧妙排序分析
排序僅僅有1。2,3三個元素的陣列。不能統計1,2。3的個數。分析 這個題目,雖然也是排序,但卻不能使用高速排序的方法。僅僅有三個元素,假設時間複雜度仍舊是o nlogn 顯然不是最好的。那就行使用線性的排序演算法,比如計數排序。但是題目中要求,不可以對1,2,3進行統計個數。那該怎樣處理呢?請大家...
待字閨中之兄弟數字分析
給定乙個數x,他的兄弟數y定義為 是由x中的數字組合而成。而且y是大於x的數中最小的。比如,38276的兄弟數字為38627。給定x,求y。分析 這個題目當然有暴力的方法。列出全部的排列組合。然後然後找到大於x中,最小的y。即。找到兄弟數字。那有沒有更好的方法呢?不想對全部情況進行窮舉。就要想辦法,...