HDU 2077 汉诺塔IV (递推)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2077

还记得汉诺塔III吗?他的规则是这样的:不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到小盘的上面。xhd在想如果我们允许最大的盘子放到最上面会怎么样呢?(只允许最大的放在最上面)当然最后需要的结果是盘子从小到大排在最右边。 

Input输入数据的第一行是一个数据T,表示有T组数据。 
每组数据有一个正整数n(1 <= n <= 20),表示有n个盘子。 
Output对于每组输入数据,最少需要的摆放次数。 
Sample Input

2
1
10

Sample Output

2
19684

题解:由汉诺塔3知从左往右的递推关系式为F[n]=F[n-1]*3+2,而此题允许最大盘在上记其步骤数为f[n],

则f[n]=F[n-1]+2。原理很简单,将上面n-1个盘看为整体先将其移到B上再将 第n个盘移到B上再将其移到C上,最后再将n-1个移到C上

 #include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <ctime>
#include <map>
#include <set>
#include <queue>
using namespace std;
#define lowbit(x) (x&(-x))
#define max(x,y) (x>y?x:y)
#define min(x,y) (x<y?x:y)
#define MAX 100000000000000000
#define MOD 1000000007
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.141592653589793238462
#define INF 0x3f3f3f3f3f
#define mem(a) (memset(a,0,sizeof(a)))
typedef long long ll;
ll gcd(ll a,ll b){
return b?gcd(b,a%b):a;
}
bool cmp(int x,int y)
{
return x>y;
}
const int N=;
const int mod=1e9+;
int main()
{
std::ios::sync_with_stdio(false);
ll F[],f[],t,n;
F[]=,f[]=;
for(int i=;i<=;i++)
F[i]=*F[i-]+;
for(int i=;i<=;i++)
f[i]=F[i-]+;
cin>>t;
while(t--){
cin>>n;
cout <<f[n]<< endl;
}
return ;
}
上一篇:php网络编程实例


下一篇:【kafka】设置指定topic和group_id消耗的offset