原题:两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事。有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置。可以摔碎两个鸡蛋。在最坏的情况下最少需要几次测试,才能得到摔碎鸡蛋的楼层?
这个题目的解答网上的答案有很多,本文就不细述了,本文主要在于n层楼,a个鸡蛋在最坏情况下的最少测试次数。

TestNum[floorNum][eggNum]表示floorNum层楼,eggNum个鸡蛋时,最坏情况下的测试次数。
动态规划算法通过将原问题分解为子问题,则:

TestNum[floorNum][eggNum]=min{ max(TestNum[floorNum-i][eggNum]+1, TestNum[i-1][eggNum-1]+1) },
其中i=1,2,...,floorNum
显然
TestNum[k][1]=k,0<=k<=eggNum;
TestNum[0][1...eggNum]=0;

解释如下:
首先在第i层扔鸡蛋,若没有破,则剩余测试次数为 :

TestNum[floorNum-i][eggNum];

若鸡蛋破了,则剩余测试次数为

TestNum[i-1][eggNum-1]

故可以据此写出解决该问题的动态规划算法的程序。

1. 带备忘的自顶向下法

int Memorized_MinTestCount(int floorNum, int eggNum)
{int **TestNum = new int *[floorNum + 1];for (int i = 0; i < floorNum + 1; i++){TestNum[i] = new int[eggNum + 1];}for (int i = 0; i < floorNum + 1; i++){for (int j = 0; j < eggNum + 1; j++){TestNum[i][j] = 0xFFFFFFFF;}}return  Memorized_Up_Bottom_MinTestCount(TestNum, floorNum, eggNum);
}int Memorized_Up_Bottom_MinTestCount(int **pNum, int floorNum, int eggNum)
{if (pNum[floorNum][eggNum] >= 0){return pNum[floorNum][eggNum];}int minNum = 0xFFFFFFFF;if (eggNum == 1){minNum = floorNum;}else if (floorNum == 0){minNum = 0;}else{for (int k = 1; k <= floorNum; k++){if (k == 1){minNum = max(Memorized_Up_Bottom_MinTestCount(pNum, floorNum - k, eggNum) + 1, Memorized_Up_Bottom_MinTestCount(pNum, k - 1, eggNum - 1) + 1);}else{minNum = min(max(Memorized_Up_Bottom_MinTestCount(pNum, floorNum - k, eggNum) + 1, Memorized_Up_Bottom_MinTestCount(pNum, k - 1, eggNum - 1) + 1), minNum);}       }}   pNum[floorNum][eggNum] = minNum;return pNum[floorNum][eggNum];
}

2. 自底向上法

int Bottom_Up_MinTestCount(int floorNum, int eggNum)
{//分配存储空间int **TestNum = new int *[floorNum + 1];for (int i = 0; i < floorNum + 1; i++){TestNum[i] = new int[eggNum + 1];}//一个鸡蛋测i层楼最坏情况需要测i次for (int i = 0; i < floorNum + 1;i++){TestNum[i][1] = i;}//不管几个鸡蛋,测0层楼最坏情况需要测试0次for (int i = 0; i < eggNum + 1;i++){TestNum[0][i] = 0;}if (eggNum==1)//如果只有一个鸡蛋,则测试的次数即为楼层数{return TestNum[floorNum][1];}int i, j, k;for (i = 2; i < eggNum + 1; i++){for (j = 1; j < floorNum + 1; j++){int minNum;for (k = 1; k <= j; k++){if (k == 1){minNum = max(TestNum[j - k][i] + 1, TestNum[k - 1][i - 1] + 1);//给minNum赋初始值}else{minNum = min(max(TestNum[j - k][i] + 1, TestNum[k - 1][i - 1] + 1), minNum);}}TestNum[j][i] = minNum;}}return TestNum[floorNum][eggNum];
}

2个鸡蛋100层楼--动态规划相关推荐

  1. 2个鸡蛋100层楼/2个玻璃珠39层楼

    题目描述: 你拿着两个鸡蛋站在100层的大楼上.鸡蛋或许结实到从楼定掉下也不会摔碎,或许很易碎.最少试验多少次可以找出鸡蛋被摔碎的最低楼层? 腾讯2017笔试题也有类似的题目,描述是针对2个玻璃珠和3 ...

  2. 你还在用二分法求2个鸡蛋100层楼的问题吗?

    题目 2个鸡蛋,100层楼,如何用最少的试验次数得到在鸡蛋落下不碎的最高层数?这一据说曾被谷歌纳入校园招聘题库的经典面试题,想必许多人都曾遇到过,又有多少人与我一样,不加思索就直接回答用二分法查找的? ...

  3. 两个鸡蛋100层楼(DP)

    #include <iostream> using namespace std;#define N 500 #define max(a,b) (a>b?a:b) #define mi ...

  4. 面试题目:2个鸡蛋100层楼问题

    一道非常经典的面试题目,给你两个鸡蛋,在一幢100层的大楼里面,至少扔几次可以测出让鸡蛋破碎的临界高度? 最朴素的做法是从100层一直扔到1层,不过这样明显不是最优的.这题目其实可以转化为dp求解,假 ...

  5. 动态规划--100层楼2只鸡蛋最少次可以测试最高楼层不摔破

    100层楼2个鸡蛋 原题目:100层楼2个鸡蛋最少需要几次测试,才能得到摔破鸡蛋的楼层: 转换题目:两个鸡蛋,进行k次测试,最多可以测试多少层? 分析:第1个鸡蛋测试所在的楼层高度为k层. ①如果第1 ...

  6. 100层楼,2个鸡蛋问题

    题目描述: 一道非常经典的面试题目,给你两个鸡蛋,在一幢100层的大楼里面,至少扔几次可以测出让鸡蛋破碎的临界高度? 两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事 ...

  7. 关于100层楼,扔两个鸡蛋,求摔碎鸡蛋的临界层的问题

    题目描述: 两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事.有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置.可以摔碎两个鸡蛋. 网上有人 ...

  8. 100层楼2个鸡蛋,测试其最低破碎楼层问题

    原文章链接 http://www.cnblogs.com/yangai/p/5391533.html http://www.tuicool.com/articles/NzUNJr http://blo ...

  9. 100层楼,最少需要几次测试,才能得到摔碎鸡蛋的楼层

    我在腾讯二面碰到了这个问题. 转自:https://blog.csdn.net/Madoka_Homura/article/details/78331152 对于这个问题,如果从编程角度而言,最简单的 ...

最新文章

  1. P5147 随机数生成器 [数列]
  2. web应用的负载均衡、集群、高可用(HA)解决方案
  3. JavaScript中的面向对象
  4. apachebench ab.exe压力测试
  5. C#设置WebBrowser IE浏览器版本
  6. Zuul:路由和高可用小结
  7. 使用Guava的AbstractInvocationHandler正确完成代理
  8. 纯净重装正版win10系统的方法
  9. C# 解析JSON方法总结
  10. “启用宏的幻灯片”是什么意思
  11. antd去掉table自带的分页条
  12. 60+最佳免费 WordPress 主题 – 完整列表(2021年)
  13. 比Python爬虫简单的爬虫方法1-后羿采集器
  14. python爬网站数据实例-如何用Python爬数据?(一)网页抓取
  15. python中sha1 md5等用法
  16. java实现凯撒密码_凯撒密码--java实现
  17. 超参数的调优(lightgbm)
  18. php 怎么远程包含,利用PHP应用程序中的远程文件包含(RFI)并绕过远程URL包含限制...
  19. Wireless Emergency Alerts 介绍(CMAS介绍)
  20. uniapp 固定首行和固定列的表格

热门文章

  1. root格式化linux,Linux-格式化与检验-mkfs
  2. 女强人开讲:事业和家庭双丰收背后好婆婆是关键!
  3. PDF转长图,用illustrator把PDF转长图,不需要代码
  4. 洛谷P1359租用游艇
  5. vistor和tsmserver不在同一台机器上的连接问题
  6. oracle实例由,Oracle 数据库的实例由( )组成
  7. python中赋值语句和判断语句结合_Python 3 学习的第二小节——判断赋值语句与简单循环...
  8. 从零基础到拿到网易Java实习offer,我做对了哪些事
  9. 如何配置无线WiFi短信认证登录?
  10. Konva Vue当中的一些技术心得