题目 <https://leetcode-cn.com/problems/super-egg-drop/>
好难。。。
看题解和看李永乐老师的视频,max我还理解,两个分叉的最大深度;min看了视频才理解,这么多选择里的最优选
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
int superEggDrop(int K, int N){
int **dp = malloc(sizeof(int*) * (K+1));//dp[i][j]表示i枚鸡蛋下,j层楼的确定F的最小移动次数
int i,j,z;
int left,right,mid;
for(i=0;i<=K;i++){
dp[i] = malloc(sizeof(int) *(N+1));
}
for(i=1;i<=K;i++){
for(j=0;j<=N;j++){
if(j == 0){
dp[i][j] = 0;//0层楼的确定F的最小移动次数0
}
else if(i == 1){
dp[i][j] = j;//1枚鸡蛋下,j层楼的确定F的最小移动次数j
}
else{
dp[i][j] = INT_MAX;
//优化之二
left = 1;right = j;
while(left<=right){
mid = left + (right-left)/2;
dp[i][j] = min(dp[i][j],max(dp[i-1][mid-1],dp[i][j-mid])+1);
if(dp[i-1][mid-1] == dp[i][j-mid]){
break;
}else if(dp[i-1][mid-1] > dp[i][j-mid]){
right = mid - 1;
}else{
left = mid + 1;
}
}
/*
dp[i][j] = INT_MAX;
for(z=1;z<=j;z++){//
//在z楼碎了 dp[i-1][z-1]+1 //递增,随着z的增加,需要的次数也会变多
//在z楼没碎 dp[i][j-z]+1 //递减,随着z的增加,需要的次数也会变少
dp[i][j] = min(dp[i][j],max(dp[i-1][z-1],dp[i][j-z])+1);//min指第一次从该层选的时候最好
if(dp[i-1][z-1] == dp[i][j-z]){//优化之一
break;
}
}
*/
}
//printf("%d, ",dp[i][j]);
}
//printf("\n");
}
int count = dp[K][N];
for(i=0;i<=K;i++){
free(dp[i]);
}
free(dp);
return count;
}