汉诺塔多塔问题

这样想,如果把A杆上的一些盘移动到其他只要不是最终目的的杆上(比如B),那么只有在A杆剩下的盘子全都到最终目的杆上,B杆剩下的盘才会轮到去往最终目的杆

ps(废话,B杆上的都比A杆上的小,A杆不移完B杆也不能摞到最终目的杆上面啊)

然后,我们就只用考虑除去B杆以外的过程

然后,就会惊奇的发现,杆少了一个,问题变成了(A-B)个盘子在(杆数-1)上的汉诺塔

然后还是多塔的汉诺塔

然后继续分出来盘子给C

然后可用杆又少了一个

好耶!

反正最终会减到三个杆的,三个杆还不会求吗?

ps(由于不知道分多少给其他杆,所以要全部试一遍,反正我想的分出来两个,然后就WA了)

#include<bits/stdc++.h>
using namespace std;
int s[20],k[20];
int main(){
    s[1]=1;
    s[2]=3;
    k[1]=1;
    for (int i=2;i<=12;i++) k[i]=2*k[i-1]+1;
    for (int i=3;i<=12;i++){
        s[i]=1e8;
        for (int j=0;j<=i;j++)
            s[i]=min(2*s[i-j]+k[j],s[i]);
        }
    for (int i=1;i<=12;i++) printf("%d\n",s[i]);
    return 0;
}

(markdown不太会用,第一篇题解,有点小激动 o(*≧▽≦)ツ┏━┓)