扔鸡蛋问题

这是一道非常经典的google面试题,在此记录一下。

具体案例引导可见:扔鸡蛋问题(四种解法)

思路

这里介绍动态规划的解法:

我们假设 F(K,N) 表示有 K 个鸡蛋、N 层楼,测出其摔碎临界点所需的最少次数,那么有如下状态转移公式:

F ( K , N ) = 1 + m i n 1 ≤ i ≤ N m a x ( F ( K , N − i ) , F ( K − 1 , i − 1 ) ) F(K, N) = 1 + min_{1 \leq i \leq N} max(F(K, N-i), F(K-1, i-1)) F(K,N)=1+min1iNmax(F(K,Ni),F(K1,i1))

  • F(K, N-i) : 如果第一个鸡蛋在第 i 层没有摔碎,那么我们还有 K 个鸡蛋以及剩余 N-i 个楼层测试
  • F(K-1, i-1) : 如果第一个鸡蛋在第 i 层摔碎,那么我们还有 K-1 个鸡蛋以及剩余 i-1 个楼层测试
  • 取两者最坏情况,再取所有情况中最小的值,表示最少测试次数。

代码

具体编程实现如下:

class Solution:

    def superEggDrop(self, K: int, N: int) -> int:
        dp = [ [0]*(N+1) for _ in range(K+1) ]
        for i in range(1, N+1):
            dp[1][i] = i
        
        for k in range(2, K+1):
            for n in range(1, N+1):
                min_drop = N
                for i in range(1, N+1):
                    tmp_max = max(dp[k-1][i-1], dp[k][n-i])
                    min_drop = min(min_drop, 1+tmp_max)
                dp[k][n] = min_drop
        return dp[K][N]

上述代码在leetcode上超时了,复制粘贴了官方的代码ac的。


参考自

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值