题目:
两个软硬程度一样的鸡蛋,它们在某一层摔下会碎,有个100层的建筑,要求最多用两个鸡蛋确 定鸡蛋安全下落的临界位置,给出临界位置?如果是n层楼,m个鸡蛋,请给出确定临界位置的算法思路:
用动态规划做:
用F[n]表示n层楼最少次数。
假设一个鸡蛋从第i层扔下,破了,则下一个鸡蛋从第1层开始扔,还需要i-1次;如果没有破,则还剩下n-i层,剩下两个鸡蛋,需要F[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
)
现在推广成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]表示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