很经典的题目,力扣上的链接:887. 鸡蛋掉落
题目大意是:有K个鸡蛋,N层楼,求你找出在最坏情况下最小的尝试次数找出鸡蛋碎的临界楼层。
解析
理解题目建议看看李永乐老师的视频:复工复产找工作?先来看看这道面试题:双蛋问题
如果不限制鸡蛋次数,想找出最少的尝试次数,直接二分区间即可,比如一共8层,第一次看看4层碎不碎,4层不碎,去6层扔…,4层碎了,去2层扔看看碎不碎…
何为最坏情况:鸡蛋破碎一定发生在搜索区间穷尽时,同时也要保证在该种情况下使得尝试次数最少。
现在给了鸡蛋的限制,只有K个,这个时候就不能直接用二分了。比如说只给你 1 个鸡蛋,7 层楼,你敢用二分吗?你直接去第 4 层扔一下,如果鸡蛋没碎还好,但如果碎了你就没有鸡蛋继续测试了,无法确定鸡蛋恰好摔不碎的楼层 F 了。这种情况下只能用线性扫描的方法,算法返回结果应该是 7 [ 1 ] ^{[1]} [1]
其实这样的话,如果使用三分,五分,十分都可以尽可能的减少尝试次数,无法直接找出最优策略,我们可以使用计算进行求解,也就是暴力枚举,在任意一个区间 [ i , j ] [i,j] [i,j],分别尝试从k层扔下鸡蛋,其中 k ∈ [ i , j ] k\in[i,j] k∈[i,j],慢慢递推,也就是动态规划的思想。
d p [ K ] [ N ] dp[K][N] dp[K][N]表示 K K K个鸡蛋, N N N层楼,找出最坏情况下最少的尝试次数的大小,假设在第i层扔鸡蛋:
- 如果碎了,此时剩下 K − 1 K-1 K−1个鸡蛋,临界就要从下面的 i − 1 i-1 i−1层楼里面找,问题就变成了 d p [ K − 1 ] [ i − 1 ] dp[K-1][i-1] dp[K−1][i−1]
- 如果没碎,还是有 K K K个鸡蛋,临界就要从上面的 N − i N-i N−i层楼里面找,问题就变成了 d p [ K ] [ N − i ] dp[K][N-i] dp[K][N−i]
无论碎没碎,扔这个鸡蛋我们都尝试了一次,所以最后要加1。
d p [ K ] [ N ] = min i ∈ [ 1 , N ] { max ( d p [ K − 1 ] [ i − 1 ] , d p [ K ] [ N − i ] ) + 1 } dp[K][N] = \min_{i\in[1,N]}\{ \max(dp[K-1][i-1],dp[K][N-i])+1\} dp[K][N]=i∈[1,