★☆★lc 887. Super Egg Drop
https://leetcode.com/problems/super-egg-drop/description/
典型2维dp。把现在第一个鸡蛋仍在k楼,碎了就是上面的楼层和剩下的鸡蛋,不碎就是下面的楼层和所有鸡蛋,于是划分了相同类型的子问题。
如果有down-top来做,就是k*n*n复杂度的,用记忆化搜索会省时间吗?貌似不会,因为涉及比较取最小,所以也是弥漫整个可能性空间?
最终的方法真是。。。真是机智的不行,智商200的人才能想出来吧?!!!
两个维度:鸡蛋数k,动作数n,而dp的值是给定k,n,最多能探测多少楼层?6666的飞起。
dp方程特别简单,不用像k*n*n方法那样尝试每个楼层,直接dp[m][k] = dp[m - 1][k - 1] + dp[m - 1][k] + 1就ok了,边界都不用管,真的是服气的。。。。
code:
class Solution: dp=None def superEggDrop(self, K, N): dp = [[0] * (K + 1) for i in range(N + 1)] for m in range(1, N + 1): for k in range(1, K + 1): dp[m][k] = dp[m - 1][k - 1] + dp[m - 1][k] + 1 if dp[m][K] >= N: return m