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 }