高楼扔鸡蛋

题目描述:面前有一栋楼从1到N共N层的楼,然后给你K个鸡蛋(K至少为1)。现在确定这栋楼存在楼层0<=F<=N,在这层楼将鸡蛋扔下去,鸡蛋恰好没摔碎(高于F的楼层都会碎,低于F的楼层都不会碎)。现在问,最坏情况下,你至少要扔几次鸡蛋,才能确定这个楼层F呢?

分析1:使用二分查找思路,从中间楼层进行尝试,实际上,如果不限制鸡蛋个数的话,二分思想显然可以得到最少尝试的次数,但问题是,现在给你了鸡蛋个数的限制K,直接使用二分思路就不行了。

原因:比如只给你1个鸡蛋,7层楼,你敢用二分吗?你直接去第4层扔一下,如果鸡蛋没碎还好,但如果碎了你就没有鸡蛋继续测试了,无法确定鸡蛋恰好摔不碎的楼层F了。

分析2:对于动态规划问题,我们需要考虑:【状态】+【选择】

  • 状态:当前拥有的鸡蛋数K和需要测试的楼层数N。随着测试的进行,鸡蛋个数可能减少,楼层的搜索范围会减小,这就是状态的变化。
  • 选择:就是选择去哪层楼扔鸡蛋。

我们选择在第i层楼扔鸡蛋之后,可能出现两种情况:鸡蛋碎了,鸡蛋没碎,所以状态转移就来了:

  • 鸡蛋碎了:那么鸡蛋的个数K--,搜索的楼层区间应该从[1...N]变为[1...i-1]共i-1层楼;
  • 鸡蛋没碎:那么鸡蛋的个数K不变,搜索的楼层区间应该从[1...N]变为[i+1...N]共N-i层楼。

分析3:定义状态转移方程:dp[k][m]=n,当前有k个鸡蛋,可以尝试扔m次鸡蛋(m是一个允许的次数上界),这个状态下,最坏情况下最多能准确测试一栋n层的楼。

int supperEggDrop(int K,int N){int m=0;while(dp[K][m]<N){m++;//状态转移}return m;
}

状态转移:

  • 无论在哪层楼扔鸡蛋,鸡蛋只可能摔碎或者没摔碎,碎了的话就测试楼下,没碎的话就测楼上;
  • 无论上楼还是下楼,总的楼层数=楼上的楼层数+楼下的楼层数+1(当前这层楼)

dp[k][m]=dp[k][m-1]+dp[k-1][m-1]+1

dp[k][m-1]就是楼上的楼层数,因为鸡蛋个数k不变,也就是鸡蛋没碎,扔鸡蛋次数m减一;dp[k-1][m-1]就是楼下的楼层数,因为鸡蛋个数k减一,也就是鸡蛋碎了,同时扔鸡蛋次数m减一。

int superEggDrop(int K,int N){vector<vector<int>> dp(K+1,vector<int>(N+1));int m=0;while(dp[K][m]<N){m++;for(int k=1;k<=K;k++){dp[k][m]=dp[k][m-1]+dp[k-1][m-1]+1;}}return m;
}

分析4:定义状态转移:dp[m][k]=n,当前尝试次数为m,有k个鸡蛋,可以测试楼层n

dp[m][k]=dp[m-1][k]+dp[m-1][k-1]+1

降维:dp[k]=dp[k]+dp[k-1]+1

 int superEggDrop(int K, int N) {vector<int> f(K+1);//f[m][k]=f[m-1][k]+f[m-1][k-1]+1//f[m][k]:最少尝试m次,鸡蛋个数有k个,可以测试的楼层//f[m-1][k]:鸡蛋没碎,尝试次数减一,鸡蛋个数还是m,可以测试楼上的层数//f[m-1][k-1]:鸡蛋碎了,尝试次数减一,鸡蛋个数减一,可以测试楼下的层数//f[k]=f[k]+f[k-1]+1int m;for(m=0;f[K]<N;m++){for(int i=K;i>=1;i--)f[i]+=f[i-1]+1;  //}return m;
}

【LeetCode系列】高楼扔鸡蛋相关推荐

  1. java动态规划鸡蛋问题_动态规划系列/高楼扔鸡蛋问题.md · lipengfei/fucking-algorithm - Gitee.com...

    # 经典动态规划问题:高楼扔鸡蛋 今天要聊一个很经典的算法问题,若干层楼,若干个鸡蛋,让你算出最少的尝试次数,找到鸡蛋恰好摔不碎的那层楼.国内大厂以及谷歌脸书面试都经常考察这道题,只不过他们觉得扔鸡蛋 ...

  2. 高楼扔鸡蛋——动态规划问题

    今天算法课大伙做了一份课堂测验,是有关一维以及二维动态规划问题的,其中最后一天压轴的就是这道高楼扔鸡蛋问题. 在我得意洋洋以为能早早做完这份测验然后交卷的时候,我在这道题上摁是扣了半小时头皮,也没写出 ...

  3. 高楼扔鸡蛋问题-经典动态规划

    文章目录 1. 高楼扔鸡蛋 2. 猜数字大小 1. 高楼扔鸡蛋 给你 k 枚相同的鸡蛋,并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑. 已知存在楼层 f ,满足 0 <= f &l ...

  4. 高楼扔鸡蛋问题 - 动态规划+反推演绎

    对于高楼扔鸡蛋问题,本文尝试反其道而行之:首先描述一个普适的高楼扔鸡蛋问题,然后利用动态规划法解决扔鸡蛋次数的问题,最后由获取次数的答案反推出扔鸡蛋的方法. 这种由次数答案反推出方法的演绎方式令人有点 ...

  5. 经典谷歌面试题:高楼扔鸡蛋

    经典谷歌面试题:高楼扔鸡蛋 存在某T层高楼,在该高楼中存在这样的一层,在该层之下的所有楼层扔鸡蛋,鸡蛋摔到地上都不会碎,还可以继续扔:在该层及该层之上的所有楼层,扔下鸡蛋都会摔碎. 目前手里有两个鸡蛋 ...

  6. Algorithm——高楼扔鸡蛋

    问题描述 高楼扔鸡蛋问题是一道经典的动态规划问题,题目如下: 给你 k 枚相同的鸡蛋,并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑.已知存在楼层 f ,满足 0 <= f < ...

  7. 算法学习笔记——动态规划:高楼扔鸡蛋

    LeetCode 887. 鸡蛋掉落 建筑有n层(取值1,2,...n),存在一个楼层F(0<=F<=n,注意F取值比n多一个),从高于F的楼层扔鸡蛋,鸡蛋会碎:否则鸡蛋不会碎 给你k枚相 ...

  8. 动态规划:高楼扔鸡蛋

    方法一:常规动态规划 1.dp[i][j]数组定义:dp[i][j]表示鸡蛋数量为i,可选楼层数为j的状态下确定F的最少步数,问题所求为dp[K][N] 2.base case:当楼层数为0,步数为0 ...

  9. 程序员小灰——谷歌面试题之高楼扔鸡蛋问题

    分享一篇文章,这个思路太棒了! 第二天 题目:扔鸡蛋问题 有2个鸡蛋,从100层楼上往下扔,以此来测试鸡蛋的硬度.比如鸡蛋在第9层没有摔碎,在第10层摔碎了,那么鸡蛋不会摔碎的临界点就是9层. 问:如 ...

最新文章

  1. 异地备份同步校验脚本
  2. Lambda 表达式的应用
  3. 数据库入门经典基础总结
  4. LeetCode每日一题 142. 环形链表 II
  5. CopyOnWriteArrayList的addIfAbsent()方法
  6. 学用软件:laTex软件初体验
  7. Hive 执行计划之Reduce Output Operator
  8. Android Studio 工程项目的结构
  9. 用python 打开qq自动输入账号密码登陆 (python3 案例1)
  10. Python爬虫——利用新浪微盘下载周杰伦的歌曲(共190首)
  11. cydia java_利用Cydia Substrate进行Android JAVA HOOK
  12. 20172305 暑假作业 之 TimeCalculate Save Iron Man
  13. Landsat 行列号与经纬度在线转换
  14. 查找Windows和MacBook序列号
  15. 编写Windows服务程序,将Python作为Windows服务启动
  16. Adobe产品adobe ID登录卡死问题的解决
  17. 常见的exceptions总结
  18. 社区计算机义务维修策划书,义务维修电脑策划书.doc
  19. 什么是盒子模型?盒子模型有哪些?怎么转换?
  20. 有skycc营销软件,我的网站PR飙升

热门文章

  1. 计算机网络关键知识点记录
  2. 大数据早报:医鸣数据完成近亿元B轮融资 阿里巴巴拟再次发行美元债券(11.15)
  3. G-LAB四月份作业-数据可视化问题探讨
  4. 【第39期】打破“打工人”魔咒,RPA 来狙击!
  5. NTFS - 获取NTFS系统格式的盘符
  6. 简单的python截屏工具
  7. n个人排名,允许并列名次,共有多少种排名结果?
  8. 关于MP4文件格式解析
  9. SpringCloud使用@Aspect面向切面处理Web请求日志
  10. 羽毛球单打和双打的有效边界区域