完整代码实现
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;
}
}
解题思路:
动态规划定义
定义 dpmk 为用 k 枚鸡蛋和 m 次尝试,最多能检查的楼层数。其递推关系为:
如果在某一层扔鸡蛋:
鸡蛋碎了:剩下 k-1 枚鸡蛋和 m-1 次尝试,能检查 dpm-1k-1 层。
鸡蛋没碎:剩下 k 枚鸡蛋和 m-1 次尝试,能检查 dpm-1k 层。
当前层:无论碎没碎,当前层本身也算一层检查。
因此,状态转移方程为:
dpmk = dpm-1k-1 + dpm-1k + 1
初始化
dpk = 0:0 次尝试无法检查任何楼层。
dpm = m:只有 1 枚鸡蛋时,必须线性检查(最多 m 层)。
算法流程
初始化二维数组 dp:大小为 (n+1) x (k+1),所有元素初始为 0。
逐步增加尝试次数 m:
对于每个 m,计算 dpmi(i 从 1 到 k)。
当 dpmk >= n 时,返回 m。
填充 dp 表:
按行(m)填充,每行更新所有鸡蛋数 i 的值。