问题

有一个n层的建筑。如果一个鸡蛋从第k层及以上落下,它会碎掉。如果从低于这一层的任意层落下,都不会碎。

有m个鸡蛋,用最坏的情况下实验次数最少的方法去找到k, 返回最坏情况下所需的实验次数。

样例

给出 m = 2, n = 100 返回 14

给出 m = 2, n = 36 返回 8

概念

在看下面的代码之前,PO主先结合扔鸡蛋这个例子讲下动态规划中的几个概念:

状态转移矩阵:结合下面的例子,直观上看就是一个简单的二维数组,也可以把它叫做“备忘录”,这个备忘录存了上面这个问题的所有子问题的子答案!别小看了这个备忘录,它避免了大量的重复计算。不信,你用2个递归+1个循环实现试试,有2个鸡蛋的情况下,楼层到36就已经慢得快计算不出来结果了!动态规划优势就体现在这儿了!当有很多重复子问题的时候,动态规划就是法拉利,其他暴力枚举递归等等都是QQ大众!

状态:就是备忘录里存的一个个子问题答案,可以简单把理解为:状态=答案

状态转移方程:就是写出母问题和子问题之间的关系!比如扔鸡蛋这个问题,你扔碎了,就转化成了往楼上找的子问题;你扔了没碎,那就转化成了往楼下找的子问题。

步骤

PO主宅心仁厚的把每一个步骤拆开了揉碎了给你们讲,具体细节我都在每一行的代码之上的注释里写的非常详尽。

接下来就是通过一行行代码,配合每行代码上的注释来学习解动态规划的步骤!上车~

利用 动态规划JAVA实现 扔鸡蛋问题:

public class Solution {

/*

* @param eggs: the number of eggs

* @param floors: the number of floors

* @return: the number of drops in the worst case

*/

public int dropEggs2(int eggs, int floors) {

// write your code here

//第一步永远是创建动态规划的备忘录,也叫状态转移矩阵

//记住:二维数组里的length是0-start的,又因为包含层数为0或鸡蛋为0的情况,所以定义行高和列宽的时候自然要加1

int[][] state = new int[eggs + 1][floors + 1];

//第二步永远是考虑边界,也就是初始化动态规划的备忘录

//先考虑eggs的边界

for (int i=0;i<=floors;i++) {

//首先是eggs=0的情况

state[0][i] = 0;

//然后是eggs=1的情况

//eggs=1的时候,肯定是从第0层一直往上实验

state[1][i] = i;

}

//再考虑floors的边界

for (int i=1;i<=eggs;i++) {

//首先是floors=0的情况

state[i][0] = 0;

//然后是floors=1的情况

state[i][1] = 1;

}

//第三步就是状态方程了

//找递推过程中的两个紧邻步骤之间的关系,如何由子结果得到母结果

//首先,鸡蛋要从2个开始算,因为0个和1个情况你已经考虑完了

for (int egg=2;egg<=eggs;egg++) {

//楼层有多高要从2层起步,因为0层和1层的情况你也考虑完了

for (int floor=2;floor<=floors;floor++) {

//看这里!这里就是你还有egg个鸡蛋,一共有floor层的子问题!

//这里定义一个变量来存储最终结果,找到在哪层扔能达到所扔次数最少的目标,扔鸡蛋次数多了胳膊会酸!

int result = Integer.MAX_VALUE;

for (int drop=1;drop<=floor;drop++) {

//这里!就是在当前子问题中,你从第drop层扔鸡蛋的情况!

//第一种情况,哎呀~碎了!那么剩下的问题就转化成了如何在drop-1层,用egg-1个鸡蛋寻找最优解

int broken = state[egg - 1][drop - 1];

//第二种请看,卧槽~没碎!问题就转化成了如果再floos-drop层,用egg个鸡蛋寻找最优解

int unbroken = state[egg][floor - drop];

//两种情况我肯定要取最大值,因为我根本不确定鸡蛋会不会碎,我特么又不是先知!

int condition = Math.max(broken, unbroken) + 1;

//不断的和上一次的结果做比较,只为得到最优的结果,最少的扔鸡蛋次数!

result = Math.min(condition, result);

}

//当前子问题(当我有egg个鸡蛋,一共有floor层时)已经for循环完了!撒花~~接下来,就是把结果存到我们的结果矩阵里了!

state[egg][floor] = result;

}

}

//以上的步骤在不断的往状态矩阵(我把它称作装满结果的大盘子!)填充结果!到这里已经都填充完毕,我们自然就可以取到我们想要的结果啦!

return state[eggs][floors];

}

}

如果以上思路对你理解动态规划和扔鸡蛋问题有帮助的话,请支持一下我们的知识易学计划,你捐助的每一分钱都是我们前行的动力,后续会分享更多的干货给大家!

java动态规划鸡蛋问题_教你彻底理解动态规划——扔鸡蛋问题 Drop Eggs2相关推荐

  1. 两个鸡蛋测试:从100层楼往下扔鸡蛋,求最坏情况下确认保证鸡蛋可以不破的最大楼层所需次数

    最坏情况下求得最优解所需的次数 内容说明 本文是在看过<<妙解谷歌压箱底面试题:如何正确的从楼上抛鸡蛋>>一文以后做的总结,该文章对此问题描写的很详细,但是在拜读的过程中也花了 ...

  2. java游戏修改文件_教你使用JavaMagic来改JAVA手机游戏软件键值和改全屏

    教你使用JavaMagic来改JAVA手机游戏软件键值和改全屏 作者:admin教程来源:百科原创点击数:6688 更新时间:2009-6-4 JavaMagic是一款为解决手机Java游戏某些兼容性 ...

  3. java 动态规划求最短路径_使用分支界定和动态规划解决最短路径问题(原)

    算法的思想: 分析题目要求,我们可以得知:算法要实现找到一条花费在1500元以下的最短的路径.其中这里面涉及两个变量,一个是路径的长度,要求最短.一个是花费,要求不大于1500元.基于这两个变量的不同 ...

  4. QQ复读机java脚本怎么用_教你制作一个QQ复读机机器人【1】接收消息

    随便说点 作为一个非常不合格的代码搬运工,一直写代码这方面都属于咸鱼级别. 但是咸鱼也是有梦想的,每天都在想着各种骚操作. 虽然不能像电影或者游戏里那样,各种神通广大,但是写一些简单小功能,还是很轻松 ...

  5. java粒子特效教程_教你用Canvas实现简单粒子动画

    使用场景: o    SplashActivity? o    - o    好像真的不多 = = 效果看着还可以,有那么几个点一定需要知道实现. o    粒子效果 o    几个坐标的计算方式 o ...

  6. java 特殊符号处理_教你如何把特殊字符处理

    银弹谷低代码v平台的表达式内有不支持的特殊字符处理 大家在做项目的过程中是否遇到过表达式内不支持一些特殊字符的情况呢? 例如:json或者token的值,是含有双引号的字符串,双引号的转义字符在表达式 ...

  7. java 获得 大盘 开盘_教你利用开盘十分钟判定当日大盘强弱(建议收藏!)

    深沪两市都可以用通过市场要素快速排序的方法告诉我们市场的真正实质.市场量价要素排序的功能是专业选手快速掌握市场真正情况的窗口,也是专业看盘的标准次序.本文教你利用开盘十分钟判定当日大盘强弱! 1,第一 ...

  8. java web 进度条_教你制做Web实时进度条

    网上已经有很多Web进度条的例子,但是很多都是估算时间,不能正真反应任务的真实进度.我自己结合多线程和ShowModalDialog制做了一个实时进度条,原理很简单:使用线程开始长时间的任务,定义一个 ...

  9. 红黑树在java中的作用_带你真正理解Java数据结构中的红黑树

    红黑树是平衡的二叉树,它不是一个完美的平衡二叉树,但是在动态插入过程中平衡二叉搜索树的代价相对较高,所以红黑树就此出现,下面就让爱站技术频道小编带你一起进入下文了解一下吧! 一.红黑树所处数据结构的位 ...

最新文章

  1. 64位环境编译DiskSim 4.0
  2. Oracle数据库的关闭详解
  3. 职业生涯设计方案,在设计时惯彻如下九条原则
  4. 孤荷凌寒自学python第八十一天学习爬取图片1
  5. 利用pip3安装包只能在python2中调用
  6. weka libsvm
  7. python笔记之正则表达式
  8. C/C++编程心得(二)
  9. js数组操作各种方法
  10. 美团将主办 ICDAR2019「中文门脸招牌文字识别」比赛,并公开首个真实场景招牌图像数据集...
  11. Jsp页面用table表格来让文字和文本框对齐
  12. 【Kafka】测试Kafka整合Flume
  13. c++ 读取写入txt
  14. Android系统框架总结(好文)
  15. HP-UX 11i v2安装使用python 2.5.2
  16. Vi编辑器编写Hello World程序
  17. PS常用工具理解及常用快捷键大全
  18. 蓝桥杯C/C++B组历届真题刷题【合集】
  19. adb 查看磁盘占用_ADB——命令大全
  20. Mac用户Excel里Wind插件相关问题

热门文章

  1. 刘金玉编程HTML5百度资源,零基础html5+div+css+js网页开发教程第006期 网页快速开发技巧...
  2. 海南三亚婚前5天5夜休闲游
  3. 考研英语作文评分标准是怎样?
  4. 店长推荐Ⅱ hburst
  5. 矢量地图包——让移动端地图飞起来
  6. 流程圣经:流程绩效管理
  7. 网上资源交易系统(ssm)
  8. 百度云大文件使用迅雷下载
  9. 中国天气网全城市代码weather_cityId
  10. Pandas处理dataframe的文本数据列:使用str属性获取数据列的字符串方法类、split函数基于指定分隔符拆分数据列的内容为列表、使用len计算每个列表的长度