OJ-Problems-Source/LeetCode/887.cpp

70 lines
1.5 KiB
C++
Raw Normal View History

2018-08-21 13:05:58 +08:00
class Solution {
public:
int superEggDrop(int K, int N) {
// dp[i][j] 用i个鸡蛋 在j步数内能走多少层
dp = new int*[K + 1];
for (int i = 1; i <= K; i++)
{
dp[i] = new int[N + 1];
dp[i][0] = 0;
dp[i][1] = 1;
}
for (int i = 1; i <= N; i++)
{
dp[1][i] = i;
}
for (int k = 2; k <= K; k++)
{
/* // O(n*n*k). TLE
for(int n=2;n<=N;n++)
{
int min_value = INT_MAX;
for (int j = 2; j <= n; j++)
{
min_value = min(min_value, max(dp[k - 1][j - 1], dp[k][n - j]) + 1);
printf("max(dp[%d][%d]=%d,dp[%d][%d]=%d)+1=%d\n",
k - 1, j - 1, dp[k-1][j-1],
k, n - j, dp[k][n-j],
max(dp[k - 1][j - 1], dp[k][n - j]) + 1 );
}
}
*/
for (int step = 2; step <= N; step++)
{
dp[k][step] = dp[k - 1][step - 1] // 在随便一层丢下去,碎了,则用k-1个鸡蛋,少一步能覆盖的数量表示这层下面有多少层
+ dp[k][step - 1] // 还是这层丢下去,没碎,那么就是k个鸡蛋,少一步能覆盖的数量表示这层上面有多少层
+ 1; // 就是这层自己
}
}
//print_table(K, N);
for (int step = 1; step <= N; step++)
{
if (dp[K][step] >= N) return step;
}
}
void print_table(int K, int N)
{
printf("DATA ");
for (int j = 1; j <= N; j++)
{
printf("%2d ", j);
}
printf("\n");
for (int i = 1; i <= K; i++)
{
printf("K=%2d ", i);
for (int j = 1; j <= N; j++)
{
printf("%2d ", dp[i][j]);
}
printf("\n");
}
}
private:
int** dp;
};