熟悉的三塔问题我们知道如何解决,但是现在变成了四个塔,又该如何解决呢。首先我们可以确定的是增加塔的数量肯定会使操作步数减少。
我们先复习一下三塔如何做:
- 将上方的n-1个盘移到中间塔
- 将第n个盘移到目标塔
- 将n-1个盘移到目标塔
考虑四塔:增加了一个塔之后,我们不必一次将上方的n-1个盘全部移动到中间塔,我们可以先将上方的i个盘在四塔的前提下移到一个中间塔,剩下三个塔,问题就变为了将剩下的塔在三塔的前提下移到目标塔,最后将之前的i个塔在四塔的前提下移到目标塔。
问题就解决了:
在求f(n)时,我们枚举先移动的i个盘,每次更新答案即可。
#include<bits/stdc++.h>
using namespace std;
int d[15],f[15];
int main(){
for(int i=1;i<=12;i++){
d[i]=2*d[i-1]+1;
}
memset(f,0x3f,sizeof f);
f[0]=0;
for(int n=1;n<=12;n++){
for(int i=0;i<n;i++){
f[n]=min(f[n],f[i]*2+d[n-i]);
}
cout<<f[n]<<endl;
}
return 0;
}