leetcode887 鸡蛋掉落


思路1:

dp+二分。

实现1:

 1 class Solution
 2 {
 3 public:
 4     int superEggDrop(int k, int n)
 5     {
 6         vector> dp(k + 1, vector(n + 1, 0x1f3f3f3f));
 7         for (int i = 0; i <= k; i++)
 8         {
 9             for (int j = 0; j <= n; j++)
10             {
11                 if (i == 1 or i >= j) dp[i][j] = j;
12             }
13         }
14         for (int i = 1; i <= k; i++)
15         {
16             for (int j = 1; j <= n; j++)
17             {
18                 int l = 1, r = j - 1, ans = -1;
19                 while (l <= r)
20                 {
21                     int m = l + r >> 1;
22                     if (dp[i - 1][m - 1] <= dp[i][j - m])
23                     {
24                         ans = m; l = m + 1;
25                     }
26                     else r = m - 1;
27                 }
28                 if (ans != -1)
29                 {
30                     dp[i][j] = min(dp[i][j], 1 + max(dp[i - 1][ans - 1], dp[i][j - ans]));
31                     if (ans + 1 < j)
32                     {
33                         ans++;
34                         dp[i][j] = min(dp[i][j], 1 + max(dp[i - 1][ans - 1], dp[i][j - ans]));
35                     }
36                 }
37             }
38         }
39         return dp[k][n];
40     }
41 };

思路2:

逆向思维dp。dp[i][j]表示i次操作,j个鸡蛋最多能确定的楼层数。

实现2:

 1 class Solution {
 2 public:
 3     int superEggDrop(int k, int n) {
 4         vector>dp(n+1,vector(k+1,0));
 5         for(int i=1;i<=n;i++){
 6             dp[i][1]=i;
 7         }
 8         for(int i=1;i<=k;i++){
 9             dp[1][i]=1;
10         }
11         int res=n;
12         bool flg=false;
13         for(int i=2;i<=n;i++){
14             for(int j=2;j<=k;j++){
15                 dp[i][j]=1+dp[i-1][j-1]+dp[i-1][j];
16                 if(dp[i][j]>=n){
17                     flg=true;res=i;break;
18                 }
19             }
20             if(flg)break;
21         }
22         return res;
23         
24     }
25 };