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(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
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层