leetcode-887-鸡蛋掉落
题目描述:
方法一:动态规划+二分搜索O(knlogn) O(kn)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Solution: def superEggDrop(self, K: int, N: int) -> int: memo = {} def dp(k, n): if (k, n) not in memo: if n == 0: ans = 0 elif k == 1: ans = n else: lo, hi = 1, n # keep a gap of 2 X values to manually check later while lo + 1 < hi: x = (lo + hi) // 2 t1 = dp(k-1, x-1) t2 = dp(k, n-x) if t1 < t2: lo = x elif t1 > t2: hi = x else: lo = hi = x ans = 1 + min(max(dp(k-1, x-1), dp(k, n-x)) for x in (lo, hi)) memo[k, n] = ans return memo[k, n] return dp(K, N)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Solution { public int superEggDrop(int K, int N) { return dp(K,N); } Map<Integer,Integer> memo = new HashMap(); public int dp(int K, int N){ if(!memo.containsKey(N *100 + K)){ int ans; if(N == 0) ans = 0; else if(K == 1) ans = N; else{ int lo = 1,hi = N; while(lo+1 < hi){ int x = (lo + hi) / 2; int t1 = dp(K-1,x-1); int t2 = dp(K,N-x); if (t1 < t2) lo = x; else if(t2 < t1) hi = x; else lo = hi = x; } ans = 1 + Math.min(Math.max(dp(K-1,lo-1),dp(K,N-lo)), Math.max(dp(K-1,hi-1),dp(K,N-hi))); } memo.put(N*100+K,ans); } return memo.get(N*100+K); } }