动态规划
设 f(n,k) 为n层楼,k个鸡蛋时,最坏情况下扔鸡蛋的次数
假设第一次在 r 层扔第一个鸡蛋, 1<=r<=n 则
亦即,choices 为第一次在 r 层扔第一个鸡蛋
f(n,k)= min{max(f(r-1,k-1),f(n-r,k))+1},1<=r<=n for k>=2,n>=1
f(n,1)=n
f(0,k)=0
如果鸡蛋破裂,则还需要 f(r-1,k-1) 次
如果鸡蛋不破裂,则还需要 f(n-r,k) 次
因为求最坏情况下,所以取二者的最大值
choice 的选择为求最小值
如上算法的解为 14 次
如果记录 choice 的话,第一次在第9层扔
这只是最优解之一
比如另一最优解为
首次在14,然后在27,39...
类似的笔试题还有
300层的楼,3个鸡蛋
答案为13次
代码
unsigned maxNum(unsigned storey, unsigned egg)
{
if(storey==0)
return 0;
if(egg==1)
return storey;
vector<vector<unsigned>> table(storey+1,vector<unsigned>(egg+1,0));
for(unsigned k=1;k<=egg;k++)
table[0][k]=0;
for(unsigned n=1;n<=storey;n++)
table[n][1]=n;
for(unsigned k=2;k<=egg;k++)
for(unsigned n=1;n<=storey;n++)
{
unsigned tmin = storey;
unsigned ostorey=1;
for(unsigned r=1;r<=n;r++)
{
unsigned tmax = max(table[r-1][k-1],table[n-r][k])+1;
tmin = tmax<tmin?tmax:tmin;
}
table[n][k]=tmin;
}
return table[storey][egg];
}
0 comments:
Post a Comment