码迷,mamicode.com
首页 > 其他好文 > 详细

Chernobyl’ Eagle on a Roof(鹰蛋坚固度)

时间:2017-03-31 23:35:50      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:put   sso   gic   wfs   border   ios7   std   key   cfs   

链接

Chernobyl’ Eagle on a Roof

题意

引用论文题意:有一堆共 M 个鹰蛋,一位教授想研究这些鹰蛋的坚硬度 E。他是通过不断从一幢 N 层的楼上向下扔鹰蛋来确定 E 的。当鹰蛋从第 E 层楼及以下楼层落下时是不会碎的,但从第(E+1)层楼及以上楼层向下落时会摔碎。如果鹰蛋未摔碎,还可以继续使用;但如果鹰蛋全碎了却仍未确定 E,这显然是一个失败的实验。教授希望实验是成功的。
例如:若鹰蛋从第 1 层楼落下即摔碎,E=0;若鹰蛋从第 N 层楼落下仍未碎,E=N。这里假设所有的鹰蛋都具有相同的坚硬度。给定鹰蛋个数 M 与楼层数 N。
要求最坏情况下确定 E 所需要的最少次数。

做法

论文里用了5种方法,这里不如我们就介绍最优的那种。

定义dp(i,j),表示第i个蛋尝试j次在最坏情况下能确定E的最高楼层数,

每一个蛋一次只能确定一层楼,所以把dp(i,1)初始化为1,假设蛋没碎,每一个蛋最坏情况要扔i次才能确定层数,所以把dp(1,i)初始化为i。

然后状态转移是这样:假设在某一层楼扔下一只蛋,且碎了,则在下面的(j-1)次里,我们要用(i-1)个蛋在下面的楼层中确定 E。为了使 dp(i,j)达到最大,我们当然希望下面的楼层数达到最多,这便是一个子问题,答案为 dp(i-1,j-1);假设蛋没碎,则在后面(j-1)次里,我们要用 i 个蛋在上面的楼层中确定 E,这同样需要楼层数达到最多,便为 dp(i-1,j),然后不管怎样,我们都用了一次。即dp(i,j)=dp(i-1,j-1)+dp(i,j-1)+1。建立新的动态规划模型,从另一个角度重新审视问题,可以更快解决一些dp问题。

技术分享

代码

#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL dp[1010][1010];
int main() {
  for(int i = 1; i <= 1000; i++) {
    dp[1][i] = i;//一个蛋试i次最坏情况可在i层确定E
    dp[i][1] = 1;//一个蛋一次只能确定一层楼
  }
  for(int i = 2; i <= 1000; i++) {
    for(int j = 2; j <= 1000; j++) {
      dp[i][j] = dp[i][j - 1] + dp[i - 1][j - 1] + 1;
    }
  }
  int n, m;//m 蛋,n 楼层
  while(cin >> m >> n, n && m) {
    LL ans = -1;
    for(int i = 1; i <= 1000; i++) {
      if(dp[m][i] >= n) {
        ans = i;
        break;
      }
    }
    if(ans == -1)
      puts("Impossible");
    else
      cout << ans << endl;
  }
  return 0;
}

相关论文:《从《鹰蛋》一题浅析对动态规划算法的优化》

?

Chernobyl’ Eagle on a Roof(鹰蛋坚固度)

标签:put   sso   gic   wfs   border   ios7   std   key   cfs   

原文地址:http://www.cnblogs.com/zhien-aa/p/6653802.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!