# 当前状态为 k 个鸡蛋,面对 n 层楼 # 返回这个状态下最少的扔鸡蛋次数 用dp 数组表示的话也是一样的: 代码语言:javascript 复制 dp[k][n]=m # 当前状态为 k 个鸡蛋,面对 n 层楼 # 这个状态下最少的扔鸡蛋次数为 m 按照这个定义,就是确定当前的鸡蛋个数和面对的楼层数,就知道最小扔鸡蛋次数。最终...
1、暴⼒穷举尝试在所有楼层 1 <= i <= N 扔鸡蛋,每次选择尝试次数最少的那⼀层; 2、每次扔鸡蛋有两种可能,要么碎,要么没碎; 3、如果鸡蛋碎了, F 应该在第 i 层下⾯,否则, F 应该在第 i 层上⾯; 4、鸡蛋是碎了还是没碎,取决于哪种情况下尝试次数更多,因为我们想求的是最坏情况下的结果。
有的读者也许会有这种想法:二分查找排除楼层的速度无疑是最快的,那干脆先用二分查找,等到只剩 1 个鸡蛋的时候再执行线性扫描,这样得到的结果是不是就是最少的扔鸡蛋次数呢? 很遗憾,并不是,比如说把楼层变高一些,100 层,给你 2 个鸡蛋,你在 50 层扔一下,碎了,那就只能线性扫描 1~49 层了,最坏情况...
res = min(res, 在第i层扔鸡蛋) return res 1. 2. 3. 4. 5. 6. 7. 状态转移:在第i层扔鸡蛋,可能会出现两种情况引起状态转移 鸡蛋碎了:鸡蛋的个数k减1,搜索的楼层区间从[1,…,N]变为[1,…,i-1].楼层数为i-1 鸡蛋未碎:鸡蛋的个数k不变,搜索的楼层区间从[1,…,N]变为[i+1,…,N]....
动态规划问题:高楼扔鸡蛋 力扣887 题 难度:困难 思路分析: 题目是这样: 你面前有一栋从 1 到N共N层的楼,然后给你K个鸡蛋(K至少为 1)。现在确定这栋楼存在楼层0 <= F <= N,在这层楼将鸡蛋扔下去,鸡蛋恰好没摔碎(高于F的楼层都会碎,低于F的楼层都不会碎)。现在问你,最坏情况下,你至少要扔几次鸡...
下面就来用我们一直强调的动态规划通用思路来研究一下这道题。 一、解析题目 题目是这样:你面前有一栋从 1 到N共N层的楼,然后给你K个鸡蛋(K至少为 1)。现在确定这栋楼存在楼层0 <= F <= N,在这层楼将鸡蛋扔下去,鸡蛋恰好没摔碎(高于F的楼层都会碎,低于F的楼层都不会碎)。现在问你,最坏情况下,你...
状态:鸡蛋数量和楼层高度。 选择:鸡蛋是否破裂。 状态转移方程: 情况有两种: 1.当前楼层鸡蛋如果破裂,那么应该从下面一层接着测试,即broken = dp(k-1,n-1)。 2.当前楼层鸡蛋如果没有破裂,那么应该从上面一层接着测试,即not_broken = dp(k,n-mid)。
方法一:动态规划 分析 边界条件 状态转移 代码实现 复杂度 方法二:动态规划 + 二分搜索 分析 代码实现 复杂度 高楼扔鸡蛋 这是一个比较经典的动态规划问题,最先来自谷歌的面试题。 题目 887. 鸡蛋掉落 方法一:动态规划 分析 我们假设 g(k,n) 表示当有 k 枚鸡蛋,楼层数为 n 时,找到临界楼层 F 所需要的...
「选择」其实就是去选择哪层楼扔鸡蛋。回顾刚才的线性扫描和二分思路,二分查找每次选择到楼层区间的中间去扔鸡蛋,而线性扫描选择一层层向上测试。不同的选择会造成状态的转移。 现在明确了「状态」和「选择」,动态规划的基本思路就形成了:肯定是个二维的dp数组或者带有两个状态参数的dp函数来表示状态转移;外加一个...
下面就来用我们一直强调的动态规划通用思路来研究一下这道题。 一、解析题目 题目是这样:你面前有一栋从 1 到N共N层的楼,然后给你K个鸡蛋(K至少为 1)。现在确定这栋楼存在楼层0 <= F <= N,在这层楼将鸡蛋扔下去,鸡蛋恰好没摔碎(高于F的楼层都会碎,低于F的楼层都不会碎)。现在问你,最坏情况下,你...