题目描述
“汉诺塔”,是一个众所周知的古老游戏。现在我们把问题稍微改变一下:如果一共有4根柱子, 而不是3根,那么至少需要移动盘子多少次,才能把所有的盘子从第1根柱子移动到第4根柱子上呢?
输入
一个正整数n。(0<n<=60)
输出
一个正整数,表示把n个盘子从第1根柱子移动到第4根柱子需要的最少移动次数。
样例输入Copy
3
样例输出Copy
5
代码:
#include<iostream>
#include<iomanip>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
long long a[61],b[61],m;
int s(int m){
if(m==0)return 0;
if(a[m]!=a[0])return a[m];
for (int i=0;i<m;i++)a[m]=min(a[m],(s(i)*2+b[m-i]));
return a[m];
}
int main(){
memset(a,127,sizeof(a));
cin>>m;
b[1]=1;
for (int i=2;i<=m;i++)b[i]=2*b[i-1]+1;
cout<<s(m);
return 0;
}