完整代码实现
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 的值。