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数组在本题并非返回结果!
多多思考,多多画图,一维不理解先看二维~冲冲冲!