李永樂老師的雙蛋問題


 1 #include<iostream>
 2 using namespace std;
 3 const int N=100+10;
 4 const int INF=0x7fffffff;
 5 int main(){
 6     int n,m;
 7     while(cin>>n>>m){
 8         int dp[N][N]={0};//dp[i][j]表示的是i層的j個雞蛋,最壞情況下需要扔的次數
 9         //下面首先進行的是初始化
10         //當只有一個雞蛋的時候,最壞情況下需要扔的雞蛋數是樓層數,因為其他的情況有找不到那一層蛋碎的可能。
11         for(int i=1;i<=n;i++)dp[i][1]=i;
12         //下面的初始化表示的是,只有一層那么最壞情況下需要扔雞蛋的次數,很明顯不管你有多少個雞蛋,只需要扔一次就可以啦。
13         for(int i=1;i<=m;i++)dp[1][i]=1;
14         //下面是主循環
15         for(int i=2;i<=n;i++){
16             for(int j=2;j<=m;j++){
17                 dp[i][j]=INF;//因為要求最小的值,所以初始化為一個很大的值。
18                 //下面是關鍵的狀態轉移方程。意思是:
19                 //我現在更新前i層,我們動態規划是每一層,每一個雞蛋都要遍歷的。
20                 //1~i層樓可以扔雞蛋,當在扔到1-i這個范圍內的第k層的時候,我們有兩種情況出現:
21                 //1.蛋碎了,那么我們就知道蛋不會碎只能在k-1層之前,我們還可以使用的蛋數目是j-1個
22                 //2.蛋沒有碎,那么我們的搜索區間變成k+1~i之間,問題規模變成i-k,雞蛋還可以接着使用
23                 //加一:含義是扔了一次雞蛋
24                 for(int k=1;k<=i;k++){
25                     dp[i][j]=min(dp[i][j],max(dp[k-1][j-1],dp[i-k][j])+1);
26                 }
27             }
28         }
29         cout<<dp[n][m]<<endl;
30     }
31     
32     return 0;
33 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM