Leetcode丢鸡蛋问题(Python)

887.鸡蛋掉落

点评:这个题是一个经典的动态规划题,符合原问题的最优解可以从子问题的最优解中得出的特点。

#超时
class Solution:
    def superEggDrop(self, K: int, N: int) -> int:
        #状态表示 当前为K个鸡蛋,N层楼时的最小移动次数
        #状态选择 如果鸡蛋碎了,K-1,1~ i-1;如果鸡蛋没碎,K不变,i+1~N
        #basecase 0个鸡蛋,需要一层层的测试;0个楼层,直接返回0
        memo = {}
        def dp(K, N):
            if K == 1:return N
            if N == 0:return 0
            if (K, N) in memo:return memo[(K, N)]
            res = float('inf')
            for i in range(1, N+1):
                res = min(res, max(dp(K-1, i-1), dp(K, N-i))+1)
            memo[(K, N)] = res
            return res
        return dp(K, N)
class Solution:
    def superEggDrop(self, K: int, N: int) -> int:
        #状态表示 dp[K][m] (题目给出K个鸡蛋,N层楼,让求最坏情况下最少的测试次数m)这里转换成给你K个鸡蛋,测试m次,最坏情况能够测试多少层楼N
        #状态选择 dp[K][m] = dp[K-1][m-1](没碎,扔鸡蛋次数-1,楼上的楼层数) + dp[K][m-1](碎了,k-1,扔鸡蛋次数m-1,楼下的楼层数) + 1
        #1.无论在哪层楼扔鸡蛋,鸡蛋都有可能碎或者没碎,碎的话就测楼下,没碎的话就测楼上;2.无论是楼上还是楼下,总=楼上+楼下+1(当前)
        #basecase 
        dp = [[0]*(N+1)for i in range(K+1)]
        m = 0
        while dp[K][m] < N:
            m += 1
            for k in range(1, K+1):
                dp[k][m] = dp[k][m-1]+dp[k-1][m-1]+1
        return m
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值