100层 2个球问题

来源:互联网 发布:竞价算法代码 编辑:程序博客网 时间:2024/05/01 12:38

 

dynamic-programming之小球健壮度

(n)给2个小球,一个100层的楼,要求用最少的掉落次数确定出球能够掉落而不摔坏的楼层数(在测试过程中,两个球都可以被摔坏)。在最坏的情况下,需要试验多少次?(每一次球出手算试验一次)
1.此问题有最优子解结构
记 T(n)为n层上最少的实验次数 使得一定可以判断出损坏的楼层。
若第一次在第1层试,碎,不用再试;不碎,则还有两个球,要测n-1层。worst=max(1,T(n-1)+1);
若第一次在第2层试,若碎,则另一球需要放到第一层试;若不碎,则余两球,要测从第三层到第n层共n-2层worst = max( 2,T(n-2)+1 );
若第一次在第a层试,则worst = max( a, 1+T(n-a) );
显然,要T(n)最优,T(n-a)需要最优。
2.此问题从最优子解中做,选择
T(n) = min( max(a,1+T(n-a) )(0<a<n)
故此问题是典型的dynamic programming.
T(0) = 0;
T(1) = 1;
T(n) = min( max(a,1+T(n-a) )(0<a<n)
由计算机得, T(0)...T(100)为:
0       1       2       2       3       3       3       4       4       4
4       5       5       5       5       5       6       6       6       6
6       6       7       7       7       7       7       7       7       8
8       8       8       8       8       8       8       9       9       9
9       9       9       9       9       9       10      10      10      10
10      10      10      10      10      10      11      11      11      11
11      11      11      11      11      11      11      12      12      12
12      12      12      12      12      12      12      12      12      13
13      13      13      13      13      13      13      13      13      13
13      13      14      14      14      14      14      14      14      14
14

可以用动态规划求解,假设有n层,m个球,f(n,m)表示用m个鸡蛋测试n层楼临界层的最少此时,则状态转移方程如下:

f(n,m) = min{max{f(r, m-1), f(n-r, m)}+1, 1<=r<=n}

边界条件: f(n, 1)=n-1, f(1, m)=f(0,m)=0

f(r, m-1)表示在第r层碎了,临界层在第1层到第r层之间; f(n-r, m)表示r层没有碎,只需测试r+1层到第n层

 

原创粉丝点击