887. 鸡蛋掉落
思路1: 超时
class Solution {
public:
int superEggDrop(int K, int N) { // K 个鸡蛋,1 到 N 共有 N 层楼的建筑。
int egg = K;
int floor = N;
if(egg < 1 || floor < 1){
return 0;
}
vector<vector<int>> track(egg + 1, vector<int>(floor + 1, 0));
for(int i = 1; i <= egg; i++){
for(int j = 1; j <= floor; j++){
track[i][j] = j;
}
}
for(int n = 2; n <= egg; n++){
for(int m = 1; m <= floor; m++){
for(int k = 1; k < m; k++){
// 第k层扔
track[n][m] = min(track[n][m], max(track[n-1][k-1], track[n][m-k])+1);// 鸡蛋碎了,n-1个鸡蛋,k-1层楼; 鸡蛋没碎,n个鸡蛋,m-k层楼
}
}
}
return track[egg][floor];
}
};
思路2: 优化dp
class Solution {
public:
int superEggDrop(int K, int N) { // K 个鸡蛋,1 到 N 共有 N 层楼的建筑。
int egg = K;
int floor = N;
// dp表示 有egg个鸡蛋,尝试tryCnt次,最多能试几层建筑
vector<vector<int>> dp(egg + 1, vector<int>(floor + 1, 0));
int tryCnt = 0;
while(dp[egg][tryCnt] < floor){
tryCnt++;
for(int k = 1; k <= egg; k++){
//鸡蛋碎了,剩k-1个鸡蛋,尝试次数tryCnt-1,这一层下面的楼数; 鸡蛋不碎,剩k个鸡蛋,尝试次数tryCnt-1,这一层上面的楼数; +1 这一层
dp[k][tryCnt] = dp[k-1][tryCnt-1] + dp[k][tryCnt-1] + 1;
}
}
return tryCnt;
}
};