题目
汉诺塔问题的加强版。
将汉诺塔问题中三座塔改成四座塔。那么当输入n个圆盘时,应该要走多少步。
输入格式
一个数n。
输出格式
一个整数,即需要走的步数。
输入样例
12
输出样例
81
数据范围
1<=n<=60
分析
四塔问题其实和三塔问题解决方案差不多,先求出三塔问题,然后当将j个盘放到一座塔某一座塔上,然后剩下n-j个盘的解决就变成了解决三塔问题,然后剩下的j个盘又是一个小的四塔问题。
因此我们可以得到递推方程:
dp4[i]=max(dp4[i],dp3[i-j]+dp4[j]*2);
具体实现如下:
#include <iostream>
#include <cstring>
using namespace std;
const int maxn=100;
int n,dp3[maxn],dp4[maxn]; //dp3代表三个塔,dp4代表4个塔
int main()
{
cin>>n;
dp3[1]=1;
for(int i=2;i<=n;i++) dp3[i]=1+dp3[i-1]*2;
memset(dp4,0x3f,sizeof(dp4));
dp4[0]=0;
for(int i=1;i<=n;i++){
for(int j=0;j<i;j++){
dp4[i]=min(dp4[i],dp4[j]*2+dp3[i-j]);
}
}
cout<<dp4[n];
return 0;
}