20140710 eagleeggs DP

鹰蛋问题

1. 若蛋只有一个 ans=m

2. 若蛋只有两个 见代码

3. 若蛋的数量超过50个 数量足够每次进行二分 见代码

4. 其他情况:

  f[i][j] 表示用 i 个蛋 尝试 j 次最坏情况下所能确定的最大高度

  初值 f[i][0]=0 f[0][j]=0 f[1][j]=j

  转移方程 f[i][j]=f[i-1][j-1]+f[i][j-1]+1

  最终要求 ans

  使 f[n][ans-1]<m f[n][ans]>=m

  用二分即可查找

算法时间复杂度 O(√n) 空间复杂度 O(log n)

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <cmath>
 5 using namespace std;
 6 #define INF 0x3f3f3f3f
 7 #define N 55
 8 #define M 50050
 9 
10 int n,m;
11 int f[N][M];
12 
13 int main() {
14     scanf("%d%d",&n,&m);
15     if (n==1) {
16         printf("%d",m);
17         return 0;
18     }
19     if (n==2) {
20         int x=(int)sqrt(m)-1;
21         while (1) {
22             if (x*(x+1)>=m*2) {
23                 printf("%d",x);
24                 return 0;
25             }
26             x++;
27         }
28     }
29     if(n>=50) {
30         int ans=0;
31         while (m>0) {
32             m>>=1; ans++;
33         }
34         printf("%d",ans);
35         return 0;
36     }
37     for (int i=0;i<N;i++) f[i][0]=0;
38     for (int i=0;i<M;i++) {
39         f[0][i]=0;
40         f[1][i]=i;
41     }
42     for (int i=2;i<N;i++) {
43         for (int j=1;j<M;j++) {
44             f[i][j]=f[i-1][j-1]+f[i][j-1]+1;
45             if (f[i][j]>=INF) f[i][j]=INF;
46         }
47     }
48    int ans=lower_bound(f[n],f[n]+M,m)-f[n];
49     printf("%d",ans);
50 }
View Code
原文地址:https://www.cnblogs.com/fjmmm/p/3838408.html