题解:三个汉诺塔如何分析:先将
i
−
1
i-1
i−1个从a柱通过三跟柱子移动到b柱,然后将最大的移到c柱,最后再将
i
−
1
i-1
i−1根通过三根柱子移动到c柱,所以递推公式为:
d
[
i
]
=
d
[
i
−
1
]
∗
2
+
1
d[i]=d[i-1]*2+1
d[i]=d[i−1]∗2+1到了四根柱子的时候,就得考虑可以先将
j
j
j个盘子移动到b/c柱,然后将剩余的
i
−
j
i-j
i−j个盘子通过三根柱子移动到d柱,最后再将
j
j
j个盘子通过四个主子移动到d柱,所以递推公式为:
f
[
i
]
=
m
i
n
(
f
[
j
]
∗
2
+
d
[
i
−
j
]
)
f[i]=min(f[j]*2+d[i-j])
f[i]=min(f[j]∗2+d[i−j])
附上代码:
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=15;
int d[maxn],f[maxn];
int main()
{
d[0]=0;d[1]=1;
for(int i=2;i<=12;i++){
d[i]=(d[i-1]*2+1);
}
memset(f,0x3f,sizeof(f));
f[0]=0;
for(int i=1;i<=12;i++){
for(int j=0;j<i;j++){
f[i]=min(2*f[j]+d[i-j],f[i]);
}
}
for(int i=1;i<=12;i++){
cout<<f[i]<<endl;
}
return 0;
}