A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

有限层数和蛋数,求即使最坏情况下需要的最少判断次数
两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事。有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置。可以摔碎两个鸡蛋。(参见两个鸡蛋--一道Google面试题这是典型的动态规划问题。假设f[n]表示从n层楼找到摔鸡蛋不碎安全位置的最少判断次数。假设第一个鸡蛋第一次从第i层扔下,如果碎了,就剩一个鸡蛋,为确定下面楼层中的安全位置,必须从第一层挨着试,还需要i-1次;如果不碎的话,上面还有n-i层,剩下两个鸡蛋,还需要f[n-i]次(子问题,实体n层楼的上n-i层需要的最少判断次数和实体n-i层楼需要的最少判断次数其实是一样的)。因此,最坏情况下还需要判断max(i-1,f[n-i])次。 状态转移方程:f[n] = min{ 1+max(i-1,f[n-i]) | i=1..n }   初始条件: f[0]=0(或f[1]=1)  实际上,两个鸡蛋的情况用数学方程就可以解决,前提是你知道该怎么扔: 一种想法是第一个鸡蛋折半搜索,如100层的楼,先从50层扔下去,如果碎了则第二个鸡蛋在1~49层楼中自底向上线性搜索;如果没碎则第一个鸡蛋再从75层扔。如果这次碎了则第二个鸡蛋在51~74层楼中自底向上线性搜索;如果还没碎则第一个鸡蛋再从88层扔,依此类推。这种方法不是最优,因为最坏情况下安全位置恰好是49层,需要尝试50次。 正确的方法是先假设最少判断次数为x,则第一个鸡蛋第一次从第x层扔(不管碎没碎,还有x-1次尝试机会)。如果碎了,则第二个鸡蛋在1~x-1层中线性搜索,最多x-1次;如果没碎,则第一个鸡蛋第二次从x+(x-1)层扔(现在还剩x-2次尝试机会)。如果这次碎了,则第二个鸡蛋在x+1~x+(x-1)-1层中线性搜索,最多x-2次;如果还没碎第一个鸡蛋再从x+(x-1)+(x-2)层扔,依此类推。x次尝试所能确定的最高楼层数为x+(x-1)+(x-2)+...+1=x(x+1)/2。 比如100层的楼,只要让x(x+1)/2>=100,得x>=14,最少判断14次。具体地说,100层的楼,第一次从14层开始扔。碎了好说,从第1层开始试。不碎的话还有13次机会,再从14+13=27层开始扔。依此类推,各次尝试的楼层依次为 14  27 = 14 + 13  39 = 27 + 12  ...  99 = 95 + 4  100  现在推广成n层楼,m个鸡蛋: 还是动态规划。假设f[n,m]表示n层楼、m个鸡蛋时找到摔鸡蛋不碎的最少判断次数。则一个鸡蛋从第i层扔下,如果碎了,还剩m-1个鸡蛋,为确定下面楼层中的安全位置,还需要f[i-1,m-1]次(子问题);不碎的话,上面还有n-i层,还需要f[n-i,m]次(子问题,实体n层楼的上n-i层需要的最少判断次数和实体n-i层楼需要的最少判断次数其实是一样的)。 状态转移方程:f[n,m] = min{ 1+max(f[i-1,m-1], f[n-i,m]) | i=1..n }  初始条件:f[i,0]=0(或f[i,1]=i),对所有i  

评分

参与人数 1黑马币 +3 收起 理由
zaydon369 + 3 很给力!

查看全部评分

10 个回复

倒序浏览
没看懂。。。

点评

据说,黑马北京校区请了个算法大师,工资是每个小时3000块,一天讲三个小时。我还是老老事实敲敲安卓得了,算法不是那么容易搞的。  发表于 2015-8-17 00:55
搜索一下google的扔鸡蛋面试题,这个是哪个题目的详解。  发表于 2015-8-17 00:42
回复 使用道具 举报
感觉好复杂
回复 使用道具 举报
风华正茂 来自手机 中级黑马 2015-8-17 12:44:03
板凳
收藏下先
回复 使用道具 举报
看的眼都花了~
回复 使用道具 举报
太多,直接没看。
回复 使用道具 举报
永飞 中级黑马 2015-8-17 21:55:05
7#
绝对大神的杰作
回复 使用道具 举报
没看懂。。。。。。。
回复 使用道具 举报
我已经看蒙圈了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马