题意就是要求解出有n个盘子四个塔的汉诺塔问题。
三个塔的经典汉诺塔很好解。用sum[n]表示有n个盘子三个塔的答案,能得到如下递推式
d[n]=d[n-1]*2+1
表示先把n-1个盘子从1塔移到2塔,再把第n个盘子移到3塔,再把n-1个盘子从2塔移到3塔。
现在考虑4塔的情况。
用num[n]表示n个盘子四个塔的答案,先考虑前i个盘子,把这i个盘子从1塔移到2塔需要num[i]步,然后把剩下n-i个盘子从1塔移到4塔需要sum[n-i]步,再把前i个盘子从2塔移到4塔需要num[i]步,这样就能的到一个递推式
num[n]=min(num[i]*2+sum[n-i]) (i>=1 && i<=n)
这样,只要先处理出三塔情况下的答案,就可以递推出四塔情况下的答案。
代码如下

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int ans3[15],ans4[15];
int main()
{
    memset(ans4,0x3f,sizeof(ans4));
    ans3[1]=1;
    for(int i=2;i<=12;++i)
        ans3[i]=ans3[i-1]*2+1;
    ans4[1]=1;
    for(int i=2;i<=12;++i)
        for(int j=1;j<=i;++j)
            ans4[i]=min(ans4[i],ans4[j]*2+ans3[i-j]);
    for(int i=1;i<=12;++i)
        printf("%d\n",ans4[i]);
    return 0;
}