思路:确切的知道楼层F,就是求出最坏情况下的最小移动次数。两个状态分别是鸡蛋个数,楼层,状态转移是在第i层楼鸡蛋是否打碎, 得到的是打碎和没有打碎两种情况的最大值。
暴力解法:会超时
class Solution {
public:
vector<vector<int>>dp;
int superEggDrop(int K, int N) {
dp.resize(K+1,vector<int>(N+1));
return help(K,N);
}
int help(int K,int N){
if(K==1) return N;
if(N==0) return 0;
if(dp[K][N]>0) return dp[K][N];
int res=INT_MAX;
for(int i=1;i<=N;i++){
res=min(res,max(help(K,N-i),help(K-1,i-1))+1);
}
dp[K][N]=res;
return res;
}
};
二分搜索优化:加快搜索鸡蛋打碎和没有打碎两种情况的最大值
class Solution {
public:
vector<vector<int>>dp;
int superEggDrop(int K, int N) {
dp.resize(K+1,vector<int>(N+1));
return help(K,N);
}
int help(int K,int N){
if(K==1) return N;
if(N==0) return 0;
if(dp[K][N]>0) return dp[K][N];
int res=INT_MAX;
int l=1,r=N;
while(l<=r){
int mid=(l+r)/2;
int broken=help(K-1,mid-1);
int not_broken=help(K,N-mid);
if(broken>not_broken){
r=mid-1;
res=min(res,broken+1);
}else{
l=mid+1;
res=min(res,not_broken+1);
}
}
dp[K][N]=res;
return res;
}
};