思路:
我们都已经知道了3个塔的方案,但我们还是来推一推
我们设f[i]表示把i个盘移动到另一个塔上的最优步数,我们考虑先把i-1个盘子移动到别的塔上,那么就是f[i-1],然后在把最大的那个盘子移动到C盘上,用了一步,最后再把i-1个盘子移动到C盘,就是f[i-1]
那么所求即为
f
[
i
]
=
f
[
i
−
1
]
∗
2
+
1
f[i]=f[i-1]*2+1
f[i]=f[i−1]∗2+1
然后考虑4塔情况
我们设d[i]为把i个盘在4个塔中移动到另一个盘的最优步数,我们先考虑设一个来枚举把j个盘子移动到另一个盘子上的情况,那么就是d[j],然后剩下i-j个盘子把它们移动到C盘的方案为f[i-j],最后再把那j个盘子移动到C盘的方案为d[j]
那么所求即为
d
[
i
]
=
d
[
j
]
∗
2
+
f
[
i
−
j
]
(
1
<
=
j
<
=
i
)
d[i]=d[j]*2+f[i-j](1<=j<=i)
d[i]=d[j]∗2+f[i−j](1<=j<=i)
code:
#include<iostream>
#include<cstdio>
using namespace std;
int f[100], d[100];
int main()
{
f[0]=1;
for(int i=1; i<=20; i++)
f[i]=f[i-1]*2;
for(int i=1; i<=20; i++)
f[i]--;
int n=1;
while(n<=12)
{
d[1]=1;
for(int i=2; i<=n; i++)
{
d[i]=123456789;
for(int j=0; j<=i; j++)
d[i]=min(d[i], d[j]+f[i-j]+d[j]);
}
printf("%d\n", d[n]);
n++;
}
}