线性递推
首先我们来看一下基本的Hanoi塔问题
有个盘子,我们的目标是将起点柱
上的盘子,借助过渡柱
移到目标柱
上去。其中大盘子不能压在小盘子上,一次只能移动
个盘子。
我们来一步一步思考:
- 如果只有
个盘子,那么我们只需要将这个盘子移到
上去
- 如果有
个盘子,那么就将小盘字移到
上,再把大盘子移到
上,再把小盘子移到大盘子上
- 如果移动的盘子数为
,那么像上图那样考虑:
我们想要移蓝色盘子,就需要把它上面的盘子全部移到过渡柱(这里不一定是,下同)上去
然后再把前个盘子移到目标上
所以,我们得出结论,对于移动第
这里设个盘子的步数,只与移动第
个盘子所需步数有关
为移动
个盘子所需的步数。
那么将前i-1个盘子移动到过渡柱上所需的步数是等同于移动到目标柱上的步数的,都为;
然后需要一步操作将第个盘子移动到目标柱上,所需步数为
从过渡柱移个盘子到目标柱上需要步数仍为
不在做赘余的解释。
那么总操作数就是
边界条件为
通项公式
线性推是的,虽说复杂度已经够了,但是有时还满足不了要求,因此我们需要推通项公式。
看这个递推式
我们不妨把这个等式两边同时
可以得到:
即
这里设为
那么
所以这个通项公式就好想了吧
现在把这个减回去,就得到了
Hanoi双塔
其实就是把我们刚刚得到的乘
,为什么呢?
不妨把题意中每两个一样大小的盘子看成一块
那就变成了一个一般的Hanoi塔问题
只不过每一次移动都需要移两次而已
通项公式
计算复杂度,因为要用快速幂
但是由于要用高精,算法复杂度会比较玄学
这题坑点在于高精。因为要写高精,通项公式就更有必要了
可以考虑用python水过
代码就不挂了