★☆★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

 

posted @ 2018-10-08 23:38  Cloud.9  阅读(240)  评论(0编辑  收藏  举报