分析
汉诺四塔
设 (f[i]) 表示求解 (i) 盘四塔的最少步数,设 (d[i]) 表示求解 (i) 盘三塔的最少步数:
[d[i]=2cdot d[i-1]+1\
f[i]=min_{j=1}^{i-1}left{2cdot f[j]+d[i-j]
ight}
]
第二个递推式的含义是,将 (j) 盘在四塔模式下移动到一个中转柱,将剩余的 (n-j) 盘在三盘模式下移动到目标柱,再将那 (j) 个盘在四盘模式下移动到目标柱。
代码
#include<cstdio>
#include<algorithm>
using namespace std;
int n,f[20],d[20];
int D(int x){
if(x==1)return 1;
if(d[x])return d[x];
return d[x]=D(x-1)*2+1;
}
int F(int x){
if(x==1)return 1;
if(f[x])return f[x];
int res=0x3f3f3f3f;
for(int i=1;i<x;i++)res=min(res,F(i)*2+D(x-i));
return f[x]=res;
}
int main(){
for(int i=1;i<=12;i++)printf("%d
",F(i));
return 0;
}