题目
思路
先定义二维数组,第一个维度索引表示剩余鸡蛋数,第二个维度索引表示楼层数,数组元素表示最小操作数。借鉴参考背包问题,根据规律,找出联系,构造式子,编写代码。
再前者的基础上,第二个维度表示操作数,元素表示最大楼层数,当前元素值不小于输入楼层值时即返回第二个维度的数字。
最后将原先的数组转化成一维的数组的形式。索引只表示剩余鸡蛋数,借助之前求解的答案累加。
C
short superEggDrop(int m, int n) {
if (n == 1)return 1;
int* dp=(int *)calloc(m+1,sizeof(int));
// 分配内存并赋值为0
short ans = 0;
short i;
do{
ans++;
i = 0;
do{
dp[i]+=(dp[i+1] + 1);
}while(++i<m);
}while(dp[0]<n);
free(dp);
dp=NULL;
return ans;
}
Cpp
class Solution {
public:
short superEggDrop(int m, int n) {
if (n == 1)return 1;
int* dp = new int[m+1]{0};
short ans = 0;
short i;
do{
ans++;
i = 0;
do{
dp[i]+=(dp[i+1] + 1);
}while(++i<m);
}while(dp[0]<n);
return ans;
}
};
Python
class Solution:
def superEggDrop(self, m, n):
dp = [0]*m
d = 1
ans = 1
m-=1
while d < n:
ans += 1
for i in range(m):
dp[i] += dp[i + 1] + 1
d+=1+dp[0]
return ans
Python3
class Solution:
def superEggDrop(self, m: int, n: int) -> int:
if n == 1:
return 1
dp = [0] * (m + 1)
ans = 0
while dp[m] < n:
ans += 1
for i in range(m, 0, -1):
dp[i] += dp[i - 1] + 1
return ans
Golang
func superEggDrop(m int, n int) int {
if n == 1{
return 1
}
var dp [101]int
dp[0]=1
var ans int
for dp[0]<n{
ans+=1
for i:=1;i<m;i++{
dp[i]+=dp[i+1]+1
}
dp[0]+=1+dp[1]
}
return ans+1
}