zoukankan      html  css  js  c++  java
  • Java实现 LeetCode 887 鸡蛋掉落(动态规划,谷歌面试题,蓝桥杯真题)

    887. 鸡蛋掉落

    你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑。

    每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去。

    你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破。

    每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= X <= N)。

    你的目标是确切地知道 F 的值是多少。

    无论 F 的初始值如何,你确定 F 的值的最小移动次数是多少?

    示例 1:

    输入:K = 1, N = 2
    输出:2
    解释:
    鸡蛋从 1 楼掉落。如果它碎了,我们肯定知道 F = 0 。
    否则,鸡蛋从 2 楼掉落。如果它碎了,我们肯定知道 F = 1 。
    如果它没碎,那么我们肯定知道 F = 2 。
    因此,在最坏的情况下我们需要移动 2 次以确定 F 是多少。
    示例 2:

    输入:K = 2, N = 6
    输出:3
    示例 3:

    输入:K = 3, N = 14
    输出:4

    提示:

    1 <= K <= 100
    1 <= N <= 10000

    一篇解释的博客

    PS:

     * 鸡蛋掉落,谷歌面试题,蓝桥杯第九届JavaC组第十题,蓝桥杯第九届JavaB组第三题(经典dp)
     * 这题我印象十分深刻(/(ㄒoㄒ)/~~)
     * 有 K 个鸡蛋,有 N 层楼,用最少的操作次数 F 检查出鸡蛋的质量。
     *
     * 思路:
     * 本题应该逆向思维,若你有 K 个鸡蛋,你最多操作 F 次,求 N 最大值。
     *
     * dp[k][f] = dp[k][f-1] + dp[k-1][f-1] + 1;
     * 解释:
     * 0.dp[k][f]:如果你还剩 k 个蛋,且只能操作 f 次了,所能确定的楼层。
     * 1.dp[k][f-1]:蛋没碎,因此该部分决定了所操作楼层的上面所能容纳的楼层最大值
     * 2.dp[k-1][f-1]:蛋碎了,因此该部分决定了所操作楼层的下面所能容纳的楼层最大值
     * 又因为第 f 次操作结果只和第 f-1 次操作结果相关,因此可以只用一维数组。
    
    class Solution {
       
        public int superEggDrop(int K, int N) {
            int[] dp = new int[K + 1];
            int ans = 0;    // 操作的次数
            while (dp[K] < N){
                for (int i = K; i > 0; i--) // 从后往前计算
                    dp[i] = dp[i] + dp[i-1] + 1;
                ans++;
            }
            return ans;
        }
     
    }
    
  • 相关阅读:
    VIJOS-P1340 拯救ice-cream(广搜+优先级队列)
    uva 11754 Code Feat
    uva11426 GCD Extreme(II)
    uvalive 4119 Always an Interger
    POJ 1442 Black Box 优先队列
    2014上海网络赛 HDU 5053 the Sum of Cube
    uvalive 4795 Paperweight
    uvalive 4589 Asteroids
    uvalive 4973 Ardenia
    DP——数字游戏
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13074736.html
Copyright © 2011-2022 走看看