1223. Chernobyl’ Eagle on a Roof(dp)&&poj3783

时间:2023-03-08 17:27:49

经典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了 

1223. Chernobyl’ Eagle on a Roof(dp)&&poj37831223. Chernobyl’ Eagle on a Roof(dp)&&poj3783
 #include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
using namespace std;
#define INF 1e9
int dp[][];
void init()
{
int i,j,k;
for(i = ; i <= ; i++)
{
dp[][i] = i;
//dp[0][i] = 0;
}
for(i = ; i <= ; i++)
{
dp[i][] = ;
dp[i][] = ;
}
for(i = ; i <= ; i++)
{
for(j = ; j <= ; j++)
{
dp[i][j] = INF;
for(k = ; k <= j ; k++)
dp[i][j] = min(dp[i][j],max(dp[i-][k-],dp[i][j-k])+);
}
}
}
int main()
{
int n,m,i,j;
init();
while(scanf("%d%d",&n,&m)!=EOF)
{
if(!n&&!m)
break;
if(n>)
n = ;
printf("%d\n",dp[n][m]);
}
return ;
}