leetcode20200411每日一题-887.鸡蛋掉落

1.题目

在这里插入图片描述

2.题目意思

扔鸡蛋,看看鸡蛋在第几层不碎。这里需要注意的是,鸡蛋碎了就不能用了,但是鸡蛋没碎的话还是可以继续用的~一开始很容易想到二分法,但是鸡蛋碎完了就做不出来了,毕竟鸡蛋是有限的,最后还是参考了别的大神的dp。

3.代码

class Solution:
    def superEggDrop(self, K: int, N: int) -> int:
        dp = [0] * (K + 1)
        m = 0
        while dp[K] < N:
            m += 1
            for k in range(K, 0, -1):
                # print(m, k)
                dp[k] = dp[k - 1] + dp[k] + 1
        return m

思路:dp

代码真的很简单,想明白我花了不少时间,还是太菜了。。。

dp[k][m]表示k个鸡蛋,扔m次,能够确定多少楼层。

直接扔dp方程:dp[k][m] = 1 + dp[k][m-1] + dp[k-1][m-1]

总的楼层 = 当前楼层+楼上楼层+楼下楼层,方程中的1就表示当前楼层,只要扔了鸡蛋就一定知道这层行还是不行;而dp[k][m-1]表示扔了鸡蛋但没碎,次数减一但数量不变,这代表楼上;而dp[k-1][m-1]表示扔了鸡蛋且碎了,次数减一且数量减一,这代表楼下。一功能推测楼层的就是这三者之和。一旦能够推测的数量到达了N(总楼层),那就等于说知道了每层扔鸡蛋会不会碎的所有情况,那就做完了。

另外,如果for循环是倒序的话,二维可以变一维,直接原地操作,这是dp基本技巧。

每次对dp数组进行修改的时候,m(移动次数)自增1,最后dp[-1]>=N时,结束,然后返回m。dp数组在本题并非返回结果!

多多思考,多多画图,一维不理解先看二维~冲冲冲!

发布了18 篇原创文章 · 获赞 1 · 访问量 796

猜你喜欢

转载自blog.csdn.net/shuaishuaihyh/article/details/105448786