动态规划求解手机耐摔指数分析
——莫激动,我们先来帮他们设个未知数 ——
假设待求的最多需要测试次数为i,把问题转向求可以测试的最大楼层数。
为了分析问题,我们先将问题的规模设定为1台手机。毋庸置疑,只有1台手机的情况下应该从第1层向高层逐层摔,若在第k(1≤k≤n)层摔坏则其耐摔指数为k,若没摔坏则继续在k+1层(若存在)摔。由此可见,其最大测试次数i就是楼层总层数,记为: m(i)=i,m是1台手机可测的楼层总数。
接下来将规模扩大到2台手机。第1台手机采用最佳策略选择在第k层摔下(无需理会具体的策略是什么),分两种情况:
情况一:如果摔坏了,则剩下1台手机,只能从1层向k-1层逐层摔,这样就将问题的规模从2台手机测试i次减少到1台手机测试i-1次的规模了,即相当于上述1台手机还有最多i-1次摔的机会,其楼层数记为:m(i-1)=i-1
情况二:如果没摔坏,则仍有2台手机继续用剩余的最多i-1次摔的机会,同样将问题的规模从最多摔i次减少为i-1次,从k+1层起向上采用最佳策略摔,楼层数记为:mm(i-1),其中mm代表2台手机摔i-1次的楼层数,则2台手机摔i次的楼层总数记为:
其中式中的1代表第k层,如下图所示:
3台手机的情况与2台手机情况类似:当采用最佳策略在第k层将第1台手机摔下,分两种情况:
情况一:如果摔坏了,则将问题的规模从3台手机最多摔i次减少为2台手机最多摔i-1次,楼层数记为:mm(i-1),正好是上一阶段的结果。
情况二:如果没摔坏,则将问题的规模从3台手机最多摔i次减少为3台手机最多摔i-1次,楼层数记为:mmm(i-1)。
所以,3台手机最多摔i次的楼层总数为:
同样,上式中的1为第k层。如下图:
上述①、②式是我们动态规划分析的结果,将问题规模缩小为子问题,子问题之间存在先续后继关系(例如,上述①式mm(i-1)是②式的子问题)。下面我们用Java语言来实现这个限定函数值mmm(代表楼层高度)来求解变量i(最大测试次数)的代码,即mmm(i)=1000时i的值(请结合注释):
当我们输入1000时,输出结果19,即为正解。
到这里,基本就结束了。