HDU - 3281 dp

题意:

给你b个球,m个楼层,你需要找到一个楼层数k,使得从小于k这个楼层上面扔下去球,而球不会碎。求在最糟糕的情况下你最多要尝试多少次

 

题解:

dp[i][j]表示你有b个球,楼层总数为m,你找到那个k一共尝试了dp[i][j]才找到

 

如果在某楼层x下扔下球,球碎了,那么dp[i][j]状态可转化为dp[x-1][j-1]   ,因为球碎了,那么证明我们要找的那个k就在[1,x]这个集合里面,又因为让你求最糟糕情况下你要尝试多少次,那么x就不会是那个我们找的k

如果在某楼层x下扔下球,球没碎,那么dp[i][j]状态可转化为dp[m-x][j]

 

 

代码:

 1 #include <bits/stdc++.h>
 2 const  int maxn=1005;
 3 const int INF=0x3f3f3f3f;
 4 using namespace std;
 5 int dp[maxn][55];
 6 int main()
 7 {
 8     int t;
 9     scanf("%d",&t);
10     while(t--)
11     {
12         memset(dp,INF,sizeof(dp));
13 
14         int p,b,m;
15         scanf("%d%d%d",&p,&b,&m);
16         for(int i=0;i<=b;++i)
17             dp[0][i]=0;
18         for(int i=1;i<=m;++i)
19         {
20             for(int j=1;j<=b;++j)
21             {
22                 for(int k=1;k<=i;++k)
23                 {
24                     dp[i][j]=min(dp[i][j],max(dp[i-k][j],dp[k-1][j-1])+1);
25                 }
26             }
27         }
28         printf("%d %d\n",p,dp[m][b]);
29     }
30     return 0;
31 }

 

posted @ 2020-04-30 09:32  kongbursi  阅读(106)  评论(0编辑  收藏  举报