LeetCode算法学习之鸡蛋掉落

完整代码实现

java 复制代码
class Solution {
    public int superEggDrop(int k, int n) {
        int[][] dp = new int[n + 1][k + 1];
        int m = 0;
        while (dp[m][k] < n) {
            m++;
            for (int i = 1; i <= k; i++) {
                dp[m][i] = dp[m - 1][i - 1] + dp[m - 1][i] + 1;
            }
        }
        return m;
    }
}

解题思路:

动态规划定义

定义 dp[m][k] 为用 k 枚鸡蛋和 m 次尝试,最多能检查的楼层数。其递推关系为:

如果在某一层扔鸡蛋:

鸡蛋碎了:剩下 k-1 枚鸡蛋和 m-1 次尝试,能检查 dp[m-1][k-1] 层。

鸡蛋没碎:剩下 k 枚鸡蛋和 m-1 次尝试,能检查 dp[m-1][k] 层。

当前层:无论碎没碎,当前层本身也算一层检查。

因此,状态转移方程为:

dp[m][k] = dp[m-1][k-1] + dp[m-1][k] + 1

初始化

dp[k] = 0:0 次尝试无法检查任何楼层。

dp[m] = m:只有 1 枚鸡蛋时,必须线性检查(最多 m 层)。

算法流程

初始化二维数组 dp:大小为 (n+1) x (k+1),所有元素初始为 0。

逐步增加尝试次数 m:

对于每个 m,计算 dp[m][i](i 从 1 到 k)。

当 dp[m][k] >= n 时,返回 m。

填充 dp 表:

按行(m)填充,每行更新所有鸡蛋数 i 的值。

相关推荐
wdfk_prog20 小时前
[Linux]学习笔记系列 -- [fs]fs-writeback
linux·笔记·学习
似水এ᭄往昔20 小时前
【C++】--封装红⿊树实现mymap和myset
开发语言·数据结构·c++·算法·stl
咕噜企业分发小米20 小时前
腾讯云向量数据库HNSW索引如何更新?
人工智能·算法·腾讯云
charlie11451419121 小时前
嵌入式现代C++教程:C++98——从C向C++的演化(3)
c语言·开发语言·c++·笔记·学习·嵌入式
lcreek21 小时前
LeetCode215. 数组中的第K个最大元素、LeetCode912. 排序数组
python·算法·leetcode
RanceGru21 小时前
LLM学习笔记8——多模态CLIP、ViLT、ALBEF、VLMo、BLIP
笔记·学习
Einsail21 小时前
天梯赛题解(3-6)
算法
杜子不疼.21 小时前
【LeetCode 852 & 162_二分查找】山脉数组的峰顶索引 & 寻找峰值元素
算法·leetcode·职场和发展
山楂树の21 小时前
搜索插入位置(二分查找)
数据结构·算法
helloyangkl21 小时前
Draco——参数说明
算法