题意:汉诺塔问题,把A柱上n个圆盘全部移到B或C柱需要的步数,不同的是给出了一个序列,AB表示把A柱顶部的圆盘移到B柱顶上(按规则),这个序列每次从左到右扫描,找到可执行的第一个指令就执行一次,然后再从头扫描,同一个圆盘不能连续移动两次。问步数。
题解:看题解的,因为序列给出,移动的顺序就是固定的,可以推出来。在序列不变的情况下,随着圆盘数量的增加,移动次数线性增加(不会证明,手动笑哭),可以得到如下递推式
f(1) = 1
f(2) = x * f(1) + y
f(3) = x * f(2) + y
暴力求出f(2)、f(3)可以解出x、y,然后就可以递推求出f(n)。
#include <stdio.h>
#include <string.h>
#include <stack>
#include <algorithm>
using namespace std;
int n, s[6][