现有鸡蛋N个,M层楼,要测试这批鸡蛋的承受力, 即测试这批鸡蛋最多从几楼扔下去后没事,最少测试几次能保证测出蛋的承受力。

这题要“最少”“保证”测出这批蛋的承受力。因此,我们要找到所有方式的最坏情况中次数最小的。

代码思维上可以这么理解

for 方式i in 所有方式:for 情况j in 所有情况:通过找到所有情况中最大次数,找到最坏情况通过比较最坏情况的最小值,找到最好的方式

比如:我可以每次一层层扔,也可以每次两层层扔。但是,如果现在在第二层,那么扔一次就到了,如果在100层,那要扔100次。因此要考虑最坏情况,就像考虑时间复杂度最小的算法一样。

很明显,只要扔一个鸡蛋下去,就能判断承受力>或< 此楼层,从此排除另一半楼层,这跟二分不是很像么!
可能很多人上来就要用二分法。但是,这就是这道题的经典之处之一了——这不像经典的二分法可以进行,因为鸡蛋个数有限。如果鸡蛋只有1个,你从m/2楼丢下去碎了,没鸡蛋了,那还测什么。。。所以二分法只是鸡蛋个数足够时的左临界值。

因此很容易想到搜索,如果用搜索,第一个蛋从第k层扔下去,有100种可能性,然后往剩余楼层扔。时间复杂度接近O(m^n),指数级的复杂度显然打扰了。

还是先看看状态,如果从第k层丢一个鸡蛋下去,会有两种情况

1. 蛋碎了: 那么下一次需要测[原最底层, k-1], 若每次把最底层看成1,那么,需要测k-1层楼。蛋数-1

2. 蛋不碎:那么下一次需要测[k +1, 原最顶层],若设最顶层为m,需要测m- k层楼。蛋数不变

而且,每次丢一个蛋后,都会有新的最底层跟最高层,即新的第1层跟第m层,这种子结构容易考虑到动态规划了

由于倒着考虑反而难,因为最后一个蛋比较特殊,必须保证它碎的一瞬间是找到楼层,也就是说,一层层丢,所以我们从倒数第二个蛋考虑,发现前面的状态也可以用,就是碎不碎的问题。

由于题目给出变量有两个,一般来说,状态也至少有两个变量。

设剩余需要测的层数为m,此时可以用层数来代表状态,设f(m, n)为剩余m层,n个鸡蛋下,保证测出承受力的最小次数

状态为f(m, n) = min( 之前最小的方式也即f(m, n),max(f(k-1, n-1), f(m-k, n)))  其中n > 1

注意边界:

这式子也很容易看出边界之一,即每个f(m, n)必须赋最大的初值(可以是无限大),保证能找到最小的f(m, n)

另外,还有一个边界,就是,只有一个鸡蛋时,只能一层层扔

技巧:对所有f(m, n)赋值层数m,可以同时解决两个问题,因为此初始化的值是一层层丢的值,也是最大值。

下面给出Java版的代码:

import java.util.Scanner;public class eggsLimit {public int eggsPrint(int M, int N){if(M <= 1 || N < 1)return 0;int[][] array = new int[M + 1][N + 1];//必须先初始化,因为会用到边界的数据,同时,能把其他值初始化,数组默认为0,Min肯定是0//此初始化的值刚好是此层的最大值, 你愿意分为边界n = 1时然后所有初始值为INF也行for(int m = 1; m <= M; m++){for(int n = 1;  n <= N; n++){//把每层最大次数初始化为层数array[m][n] = m;}}for(int m = 1; m <= M; m++){for(int n = 2;  n <= N; n++){//枚举从第几层丢for(int k = 1; k <= m; k++){//每层找到最大的a[m][n],代表最坏的可能性,所有a[m][n]中找到最小的。代表最好的选k方式 array[m][n] = Math.min(array[m][n], 1 + Math.max(array[k - 1][n - 1], array[m - k][n]));}}}return array[M][N];}public static void main(String arg[]){eggsLimit e = new eggsLimit();Scanner scan = new Scanner(System.in);int M = scan.nextInt();int N = scan.nextInt();int result = e.eggsPrint(M, N);System.out.print(result);}}

时间复杂度为O(M*M*N),空间复杂度为O(M*N)。由于每次只需要每种情况的最坏情况比较,若使用滚动数组,可以使空间复杂度降到O(M),具体代码就不再给出

经典DP:测试鸡蛋承受力相关推荐

  1. 动态规划经典题目_动态规划经典题目:鸡蛋掉落(附视频讲解)

    题目: 思路: 先放上视频讲解 动态规划经典题目:鸡蛋掉落https://www.zhihu.com/video/1225199247848513536 纠正:视频里的状态转移方程漏写了一个+1,意思 ...

  2. 经典dp最长递增子序列

    经典dp最大递增子序列,  看了好长时间,看了好多版本.最终因为这个看懂,也觉得这个是最全面的吧,我感觉我好菜啊. http://wenku.baidu.com/view/bed07b15552707 ...

  3. dp 扔鸡蛋_使用动态编程(DP)的鸡蛋掉落问题

    dp 扔鸡蛋 Problem statement: You are given N floor and K eggs. You have to minimize the number of times ...

  4. c语言经典测试,c语言经典写作测试(非常完整).doc

    c语言经典写作测试(非常完整) 歼隔啄穷潘破赵曲潘彰迭挪辫锹晓蔼斗君秉缚迈奄信菩敲褒辣爬丹业蟹庇捞广囤哉观远跌寇阀稳驻听摔选逮亩医防厄近滤完嚎赋识辩纶颇胃爱熙赂脆撅违镁挽忠槛堂艳襟昼喂戊契页刚淄寿置邻 ...

  5. 【动态规划·经典例题】鸡蛋的硬度

    鸡蛋的硬度 总时间限制: 1000ms 内存限制: 65536kB 描述 最近XX公司举办了一个奇怪(super strange!)的比赛:鸡蛋硬度之王争霸赛.参赛者是来自世 界各地的母鸡,比赛的内容 ...

  6. 最小编辑距离算法 Edit Distance(经典DP)

    最小编辑距离算法 Edit Distance(经典DP) 转载baodream 最后发布于2018-05-23 11:36:32 阅读数 22226  收藏 展开 编辑距离(Edit Distance ...

  7. leetcode:887. 鸡蛋掉落【经典dp定义】

    目录 题目截图 题目分析 ac code 总结 题目截图 题目分析 变量:鸡蛋的数量,楼层n,尝试的次数m 有一个单调性容易发现:尝试的次数越多,能解决楼层越高的确切值 另一个单调性:鸡蛋的数量越多, ...

  8. HDU 1069 Monkey and Banana(简单图解,经典DP,最大上升子序列变形)

    题目链接 今天做的第二题,感觉比较经典,详细记录一下吧! Monkey and Banana Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...

  9. Apple Catching经典dp

    Apple Catching - POJ 2385 - Virtual Judge 状态:第i分钟移动j次能吃多少个苹果 决策:第i分钟动不动 转移:如果移动,dp[i][j]=dp[i-1][j-1 ...

最新文章

  1. TypeScript学习笔记之 接口(Interface)
  2. 谷歌最强 NLP 模型 BERT 解读
  3. linux系统如何查看是否是线程死锁,多线程中如何使用gdb精确定位死锁问题
  4. 第一章 计算机语言分类
  5. CRM My Opportunity max hit的技术实现
  6. 杭电acm2059-龟兔赛跑 java
  7. 原型 原型链 call / apply
  8. gradle kotlin_我对Gradle Kotlin DSL的第一印象
  9. php urledcode_用JavaScript实现PHP的urldecode函数
  10. java batik_[导入]Apache Batik,又爱又恨
  11. c语言输入年月的流程图_C语言程序流程图
  12. 项目管理 计算机仿真,刘宝林老师【项目管理】《挑战埃及》沙盘课程内容分享...
  13. 微信小程序如何使用视频组件
  14. c语言设计第三版100行作业答案,经典C语言程序设计100例.南开100题和30套模拟上机试题及答案.pdf...
  15. selenium中模拟鼠标操作
  16. 学会 Python 到底能干嘛?我们整理出了 7 大工作方向……
  17. 关于4418开发和6818开发
  18. 食品生产设备用什么清洗消毒效果比较好?
  19. 【Markdown Pad 2常见问题3】Markdown Pad 2插入本土图片无法显示
  20. 戴尔3080计算机重装系统步骤,戴尔OptiPlex 3080MT台式机重装系统BIOS设置教程

热门文章

  1. 水热耦合模型SHAW驱动数据说明和运行方法
  2. 基于SSH架构的在线答疑系统
  3. 阿里风控大脑如何应用大数据来构建风控体系?
  4. 美丽的窗花java分形_活动设计——美丽的窗花 (设计意图及教学反思)
  5. 天河计算机学院,23名90后加入国防科大“天河”超级计算机团队
  6. [WebGL入门]二,开始WebGL之前,先了解一下canvas
  7. 线程安全问题经典案例---卖票
  8. JVAV第八次实验:多线程与异常处理
  9. 【数据结构与算法】二叉树题目很难?一句话秒杀基础二叉树题目
  10. loading的使用