zoukankan      html  css  js  c++  java
  • 1223. Chernobyl’ Eagle on a Roof(dp)&&poj3783

    经典DP

    n个鹰蛋 m层楼 刚开始是二分想法 不过当数小于二分的那个值 貌似没发判断

    dp[i][j] = min(dp[i][j],max(dp[i-1][k-1],dp[i][j-k]) 选择第k层扔 若碎了 就用剩下i-1个鹰蛋来测k-1层 若没碎 就用i个鹰蛋来测上面剩下的j-k层 

    这样是三重循环 1000^3势必TLE 不过以二分的思想来算 1000层最多只需要10个鹰蛋就可以测出来了 所以当n大于10的时候按10来算就OK了 

     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<stdlib.h>
     6 using namespace std;
     7 #define INF 1e9
     8 int dp[12][1010];
     9 void init()
    10 {
    11     int i,j,k;
    12     for(i = 1; i <= 1000 ; i++)
    13     {
    14         dp[1][i] = i;
    15         //dp[0][i] = 0;
    16     }
    17     for(i = 1;  i <= 10 ; i++)
    18     {
    19         dp[i][0] = 0;
    20         dp[i][1] = 1;
    21     }
    22     for(i = 2; i <= 10 ; i++)
    23     {
    24         for(j = 1; j <= 1000 ; j++)
    25         {
    26             dp[i][j] = INF;
    27             for(k = 1; k <= j ; k++)
    28             dp[i][j] = min(dp[i][j],max(dp[i-1][k-1],dp[i][j-k])+1);
    29         }
    30     }
    31 }
    32 int main()
    33 {
    34     int n,m,i,j;
    35     init();
    36     while(scanf("%d%d",&n,&m)!=EOF)
    37     {
    38         if(!n&&!m)
    39         break;
    40         if(n>10)
    41         n = 10;
    42         printf("%d
    ",dp[n][m]);
    43     }
    44     return 0;
    45 }
    View Code

  • 相关阅读:
    Redis分布式锁的实现原理
    Redis锁的简单应用
    Redis所需内存 超过可用内存怎么办
    redis学习笔记之虚拟内存
    组织安全性SQL
    应收发票相关脚本
    用户与职责与请求关系语句
    应收事物处理删除 SQL 语句
    总账库存科目明细追溯
    月结各模块关闭情况查询
  • 原文地址:https://www.cnblogs.com/shangyu/p/3379052.html
Copyright © 2011-2022 走看看