高楼扔鸡蛋问题C++
时间: 2024-01-11 16:20:24 浏览: 33
以下是高楼扔鸡蛋问题的C++代码实现:
```c++
#include <iostream>
#include <cstring>
using namespace std;
int dp[105][10005];
int main() {
int T;
cin >> T;
while (T--) {
int k, n;
cin >> k >> n;
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++) {
dp[1][i] = i;
}
for (int i = 2; i <= k; i++) {
for (int j = 1; j <= n; j++) {
dp[i][j] = j;
for (int k = 1; k <= j; k++) {
dp[i][j] = min(dp[i][j], max(dp[i - 1][k - 1], dp[i][j - k]) + 1);
}
}
}
cout << dp[k][n] << endl;
}
return 0;
}
```
相关问题
高楼扔鸡蛋动态规划的递推方程式
高楼扔鸡蛋问题是一个经典的动态规划问题,其递推方程式如下:
令 dp[i][j] 表示有 i 个鸡蛋,j 层楼时的最小尝试次数。
则对于每一次尝试,我们可以选择在第 k 层楼扔鸡蛋,其中 1 <= k <= j。
如果鸡蛋碎了,那么我们需要在第 k 层以下的楼层继续尝试,即 dp[i-1][k-1]。
如果鸡蛋没碎,那么我们需要在第 k 层以上的楼层继续尝试,即 dp[i][j-k]。
因此,我们可以得到递推方程式:
dp[i][j] = min(max(dp[i-1][k-1], dp[i][j-k]) + 1),其中 1 <= k <= j
其中 max(dp[i-1][k-1], dp[i][j-k]) + 1 表示在第 k 层楼扔鸡蛋的最坏情况下的尝试次数,而 min() 则表示在所有可能的 k 中取最小值。
动态规划—鸡蛋掉落问题
鸡蛋掉落问题是一个经典的动态规划问题。问题描述如下:有一栋高楼,给你两个鸡蛋。如果把鸡蛋从某一层扔下去,鸡蛋会摔碎,如果不摔碎,可以重复使用。现在问你:怎样用最少的尝试次数找出鸡蛋恰好摔碎的楼层?
假设我们有 $n$ 层楼,$k$ 个鸡蛋,我们要求的是最坏情况下最少需要的试验次数。
我们可以根据第一次扔鸡蛋的结果分为两种情况:
1. 鸡蛋碎了:这个时候我们只能从第一层开始逐个尝试。因此需要 $1+f(k-1,n-1)$ 次尝试,其中 $f(k-1,n-1)$ 表示剩下的 $k-1$ 个鸡蛋和 $n-1$ 层楼的情况下最坏情况下需要的尝试次数。
2. 鸡蛋没碎:这个时候我们需要在剩下的 $n-x$ 层楼中尝试。因此需要 $1+f(k,n-x)$ 次尝试,其中 $f(k,n-x)$ 表示剩下的 $k$ 个鸡蛋和剩下的 $n-x$ 层楼的情况下最坏情况下需要的尝试次数。
因此,我们可以得到状态转移方程:
$$f(k,n)=\min_{1\leq x\leq n}\{1+\max(f(k-1,n-1),f(k,n-x))\}$$
其中 $f(k,n)$ 表示 $k$ 个鸡蛋和 $n$ 层楼的情况下最坏情况下需要的尝试次数。
时间复杂度为 $O(kn^2)$。