有限层数和蛋数,求即使最坏情况下需要的最少判断次数
两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事。有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置。可以摔碎两个鸡蛋。
这是典型的动态规划问题。假设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
原文地址:http://www.cnblogs.com/ltang/archive/2010/11/23/1885791.html
分享到:
相关推荐
在扔鸡蛋问题中,动态规划可以帮助我们找出在有限的鸡蛋数量下,找到鸡蛋不会摔碎的最高楼层所需的最少尝试次数。 扔鸡蛋问题通常设定为有M层楼和N个鸡蛋,目标是找到摔不碎鸡蛋的临界点。这个问题的关键在于确定一...
扔鸡蛋问题是计算机程序设计中的一个经典问题。从一幢楼房的不同楼层往下扔鸡蛋,用最少的最坏情况试验次数,确定鸡蛋不会摔碎的最高安全楼层。仅有一个鸡蛋供试验时,只能采用顺序查找法。有足够多的鸡蛋时,可以...
每次你可以选择一个楼层扔鸡蛋,但目标是用最少的次数找出这个高度。 解决这个问题,通常采用动态规划的方法。我们可以定义状态D[i][j]表示有i个鸡蛋和j层楼时,最小的试验次数。状态转移方程可以表示为: 1. 如果...
在这个问题中,我们需要解决如何用最少的尝试次数确定从一栋高楼的哪一层扔鸡蛋,鸡蛋会在落地后破裂。 首先,让我们深入理解动态规划。动态规划是一种用于求解具有重叠子问题和最优子结构特征的问题的方法。在这个...
- 如果鸡蛋没摔碎,我们需要在剩下的n-x层中寻找临界楼层,此时问题转化为F(n-x, k)。 因此,我们可以得出递归公式: \[ F(n, k) = \min_{1 \leq x \leq n} (1 + \max(F(x-1, k-1), F(n-x, k))) \] 初始条件为: ...
5. **扔鸡蛋问题**:这是经典的“丢鸡蛋问题”,目的是确定在多少层楼鸡蛋会破,而只需要最小的试验次数。采用分区间策略,通过第一个鸡蛋确定大致范围,第二个鸡蛋在确定的范围内逐步缩小搜索。使用等差数列求和...
1. 客观题1:鸡蛋问题 这道题考察了候选人的逻辑思维和解决问题的能力。假设有一只鸡蛋,从不同的楼层往下扔,需要找到鸡蛋刚好摔破的楼层。如果只有一个鸡蛋,需要从下往上一层层试。现在有两个鸡蛋,那么最多需要...
现在定义一个k (1),我们从第k层扔下去一个鸡蛋,如果鸡蛋碎了,我们就要往低一点的楼层去找,则当前dp[t][n]状态是dp[k-1][n-1]+
问题是,你需要扔多少次鸡蛋才能算出该楼层。整个过程中,你只允许打碎两个鸡蛋。 **职位:** 产品经理 **解析:** 此题考查应聘者的数学建模能力和算法优化思维。 1. **分段查找:** 将楼层划分为若干段,先确定...
问题5涉及力的相互作用,鸡蛋磕碗沿,是因为两者之间力的作用是相互的。 6. **液体压强与浮力**:问题7的潜水艇模型展示了浮力的原理,以及改变容器内部气体体积如何影响浮力。悬浮时,浮力等于重力,若吸气使得...
9.扔鸡蛋确定楼层问题..-. 02 10.左上右下最大流问题 106 11.三角形内产生随机数 111 12.赛与问题 …111 13.过河问题〔 intel)… 113 14.数星星问题.… 114 15.交流问题/ Gossip problem 114 16....