HDU 2077 汉诺塔IV (递推)
2024-09-01 07:19:48
题目链接: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 ;
}
最新文章
- Windows下安装scikit-learn
- PHPExcel
- 6.7-3将数组arr中索引值为2的元素替换为“bb”
- POJ1011
- JS开发windows phone8.1系列之2
- 更快的方式实现PHP数组去重
- scikit-learn主要模块和基本使用方法
- 如何通过XShell传输文件
- 【循序渐进学Python】8.面向对象的核心——类型(下)
- pthread_cond_wait 信号量丢失
- 命令行dump anr traces.txt文件
- LeetCode144:Binary Tree Preorder Traversal
- php 实现同一个账号同时只能一个人登录
- Red Gate系列之八 SQL Connect 1.1.1.19 Edition 数据库连接及操作工具 完全破解+使用教程
- [大数据]-Elasticsearch5.3.1+Kibana5.3.1从单机到分布式的安装与使用<;1>;
- JS判断输入类型是否为正整数
- ASP.NET MVC编程——缓存
- MYSQL常用的性能指标总结和归纳
- SQL 读取csv 文件批量插入数据
- 通过LVM给Linux扩容