887. 鸡蛋掉落 Super Egg Drop

题目 <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;
    
}

猜你喜欢

转载自blog.csdn.net/ZRXSLYG/article/details/111657538