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\n",dp[n][m]);
43     }
44     return 0;
45 }
View Code

posted @ 2013-10-20 14:40  _雨  阅读(284)  评论(0编辑  收藏  举报