• zstu 4214 高楼扔鸡蛋(google 面试题)dp


    input

    T  1<=T<=10000

    n m  1<=n<=2000000007 1<=m<=32

    output

    m个鸡蛋从1到n哪一楼x扔下去刚好没碎,而再x+1楼扔下去就碎了,求最少扔的次数无论x为1到n的哪个数都能确定x

    如果x>32,输出Impossible,否则输出x

    做法:dp,d(x,y)=d(x,y-1)+d(x-1,y-1),x:egg,y:floor求出下限,即x个鸡蛋至少要试多少次

     1 # include <stdio.h>
     2 # include <limits.h>
     3 #define INF 2000000010
     4 int max(int a, int b) { return (a > b)? a: b; }
     5 int eggFloor[100][1000];
     6 int eggDrop(int n, int k)
     7 {
     8     /* eggFloor[i][j] 表示对于 i个鸡蛋 j 层楼,需要的最少测试次数 */
     9     int res;
    10     int i, j, x;
    11     // 初始化
    12     for (i = 1; i <= n; i++)
    13     {
    14         eggFloor[i][1] = 1;
    15         eggFloor[i][0] = 0;
    16     }
    17  
    18     //只有一个鸡蛋,没得优化,需要j次
    19     for (j = 1; j <= k; j++)
    20         eggFloor[1][j] = j;
    21  
    22     // 最优子结构的递推
    23     for (i = 2; i <= n; i++)
    24     {
    25         for (j = 2; j <= k; j++)
    26         {
    27             eggFloor[i][j] = INT_MAX;
    28             for (x = 1; x <= j; x++)
    29             {
    30                 res = 1 + max(eggFloor[i-1][x-1], eggFloor[i][j-x]);
    31                 if (res < eggFloor[i][j])
    32                     eggFloor[i][j] = res;
    33             }
    34         }
    35     }
    36 }
    37 int a[2][40][40];
    38 int init()
    39 {
    40     for(int i=1;i<=32;i++) { a[1][i][1]=a[0][i][1]=1;a[1][i][0]=a[0][i][0]=0; }
    41     for(int j=1;j<=32;j++) a[0][1][j]=a[1][1][j]=j;
    42     for(int i=2;i<=32;i++)//egg
    43     {
    44         for(int j=2;j<=32;j++)//floor
    45         {
    46             a[0][i][j]=a[1][i][j-1]+1;
    47             a[1][i][j]=a[0][i][j]+a[1][i-1][j-1];
    48             if(a[0][i][j]<0) a[0][i][j]=INF;
    49             if(a[1][i][j]<0) a[1][i][j]=INF;
    50         }
    51     }
    52     for(int i=1;i<=32;i++,printf("
    "))
    53         for(int j=1;j<=32;j++)
    54             printf("%2d,%2d ",a[0][i][j],a[1][i][j]);
    55 }
    56 int b[40][40];
    57 int init1()
    58 {
    59     for(int i=1;i<=33;i++) { b[i][1]=1;b[i][0]=0; }
    60     for(int j=1;j<=33;j++) b[1][j]=j;
    61     for(int i=2;i<=33;i++)
    62     {
    63         for(int j=2;j<=33;j++)
    64         {
    65             b[i][j]=1+b[i][j-1]+b[i-1][j-1];
    66             if(b[i][j]<0) b[i][j]=INF;
    67         }
    68     }
    69 /*    for(int i=1;i<=33;i++,printf("
    "))
    70         for(int j=1;j<=33;j++)
    71             printf("%d ",b[i][j]);*/
    72 }
    73 /* 测试*/
    74 int main()
    75 {
    76 //    freopen("out","w",stdout);
    77 //    init();
    78     init1();
    79     int n,k,i,T;
    80     scanf("%d",&T);
    81     while(T--)
    82     {
    83         scanf("%d%d",&n,&k);
    84         for(i=1;i<=32;i++) if(n<=b[k][i]) break;
    85         i<=32?printf("%d
    ",i):puts("Impossible");
    86     }
    87     return 0;
    88     eggDrop(n,k);
    89     for(int i=1;i<=n;i++)//egg
    90     {
    91         for(int j=1;j<=k;j++) printf("%2d ",eggFloor[i][j]);
    92         printf("
    ");
    93     }
    94     return 0;
    95 }
    View Code
  • 相关阅读:
    贮油点问题(C++)
    二维数组操作
    二的幂次方(递归)
    [haoi2009]巧克力
    距离最远的牛
    ssh注解basedao简单的实现
    @service中构造方法报错
    spring注解 构造函数问题
    json与gson
    AsyncTask异步类的简单操作
  • 原文地址:https://www.cnblogs.com/cdyboke/p/5064711.html
Copyright © 2020-2023  润新知