[递推]B. 【例题2】奇怪汉诺塔
B
.
【
例
题
2
】
奇
怪
汉
诺
塔
B. 【例题2】奇怪汉诺塔
B.【例题2】奇怪汉诺塔
题目描述
汉诺塔问题,条件如下:
- 这里有
A
A
A、
B
B
B、
C
C
C 和
D
D
D 四座塔。 这里有
n
n
n个圆盘,
n
n
n 的数量是恒定的。
- 每个圆盘的尺寸都不相同。
- 所有的圆盘在开始时都堆叠在塔
A
A
A上,且圆盘尺寸从塔顶到塔底逐渐增大。
- 我们需要将所有的圆盘都从塔
A
A
A 转移到塔
D
D
D 上。
- 每次可以移动一个圆盘,当塔为空塔或者塔顶圆盘尺寸大于被移动圆盘时,可将圆盘移至这座塔上。
- 请你求出将所有圆盘从塔
A
A
A 移动到塔
D
D
D,所需的最小移动次数是多少。
输入格式
没有输入。
输出格式
对于每一个整数
n
(
1
≤
n
≤
12
)
n(1 ≤ n ≤ 12)
n(1≤n≤12),输出一个满足条件的最小移动次数,每个结果占一行。
题目解析
看题目,是汉诺塔,只是常规的三塔变成了四塔.
那么我们就考虑四塔的做法.
首先我们定义
d
i
d_{i}
di为三塔时
n
n
n个盘从
A
A
A塔到
C
C
C塔所需的步数.
那么可以得出(证明略):
d
1
=
1
d_{1} = 1
d1=1
d
i
=
d
i
−
1
∗
2
−
1
(
i
>
1
)
d_{i} = d_{i-1}*2-1~~~~~~~~~~~~~~(i>1)
di=di−1∗2−1 (i>1)
然后我们定义
f
(
i
)
f(i)
f(i)为四塔汉诺塔的最优步数为考虑四塔汉诺塔的算法思想,叫Frame算法:
用四柱汉诺塔算法把
A
A
A柱上部分的
n
−
r
n- r
n−r个碟子通过
C
C
C柱和
D
D
D柱移到
B
B
B柱上(为
f
(
n
−
r
)
f( n- r )
f(n−r)步)。
用三柱汉诺塔经典算法把
A
A
A柱上剩余的
r
r
r个碟子通过
C
C
C柱移到
D
D
D柱上(三塔汉诺塔
r
r
r盘的步数)。
用四柱汉诺塔算法把
B
B
B柱上的
n
−
r
n-r
n−r个碟子通过
A
A
A柱和
C
C
C柱移到
D
D
D柱上(为
f
(
n
−
r
)
f(n-r)
f(n−r)步)。
依据上边规则求出所有
r
(
1
≤
r
≤
n
)
r(1≤r≤n)
r(1≤r≤n)情况下步数
f
(
n
)
f(n)
f(n),取最小值得最终解。
f
[
i
]
=
m
i
n
{
f
[
i
]
2
∗
f
[
j
]
+
d
[
i
−
j
]
f[i] = min \left\{\begin{matrix} & f[i]\\ & 2 * f[j] + d[i - j]\\ \end{matrix}\right.
f[i]=min{f[i]2∗f[j]+d[i−j]
Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll d[305], f[305];
int main ()
{
d[1] = f[1] = 1;
for (int i = 2; i <= 12; ++ i)
d[i] = d[i - 1] * 2 + 1;
for (int i = 2; i <= 12; ++ i)
{
f[i] = 999999999;
for (int j = 1; j <= i; ++ j)
f[i] = min (f[i], 2 * f[j] + d[i - j]);
}
for (int i = 1; i <= 12; ++ i)
printf ("%d\n", f[i]);
return 0;
}
[递推]B. 【例题2】奇怪汉诺塔的更多相关文章
- C++例题2:汉诺塔问题
#include<iostream>#include<stdlib.h>using namespace std;void Hanoi(int n,char A,char B,c ...
- HDU 汉诺塔系列
做了这一系列题,表示对汉诺塔与这一系列递推理解加深了 经典汉诺塔:1,2,...,n表示n个盘子,数字大盘子就大,n个盘子放在第1根柱子上,按照从上到下 从小到大的顺序排放,过程中每次大盘都不能放在小 ...
- 【BZOJ 1019】【SHOI2008】汉诺塔(待定系数法递推)
1019: [SHOI2008]汉诺塔 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 559 Solved: 341[Submit][Status] ...
- 汉诺塔III 递推题
题目描述: 约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下.由小到大顺序串着由64个圆盘构成的塔.目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动 ...
- BZOJ 1019 :[SHOI2008]汉诺塔(递推)
好吧蒟蒻还是看题解的 其实看到汉诺塔就该想到是递推了 设f[i][j]表示i个在j杆转移到另一个杆的次数 g[i][j]表示i个在j杆转移到那个杆上 可得 f[i][j]=f[i-1][j]+1+f[ ...
- hdu 1207 汉诺塔II (DP+递推)
汉诺塔II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- Acwing-96-奇怪的汉诺塔(递推)
链接: https://www.acwing.com/problem/content/description/98/ 题意: 汉诺塔问题,条件如下: 1.这里有A.B.C和D四座塔. 2.这里有n个圆 ...
- HDU 1207 汉诺塔II (递推)
经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘.上 ...
- HDU 1207 汉诺塔II (找规律,递推)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1207 汉诺塔II Time Limit: 2000/1000 MS (Java/Others) ...
随机推荐
- auto scroll bottom in js
auto scroll bottom in js autoScrollToBottom() { let box = document.querySelector(`[data-dom="ch ...
- CORS & OPTIONS & preflight request
CORS & OPTIONS preflight request CORS 原理 CORS跨域的原理实际上是浏览器与服务器通过一些HTTP协议头来做一些约定和限制 OPTIONS 应用场景 h ...
- c++ 使用PID获取顶级窗口句柄和标题
#include <iostream> #include <Windows.h> using namespace std; BOOL CALLBACK EnumWindowsP ...
- H5 常见问题汇总及解决方案
原文链接:http://mp.weixin.qq.com/s/JVUpsz9QHsNV0_7U-3HCMg H5 项目常见问题汇总及解决方案 -- 由钟平勇分享 转自 https://github.c ...
- centos7下载和安装 通过xshell连接,有手就行,小白教程
下载步骤: https://mirrors.aliyun.com/centos/?spm=a2c6h.13651104.0.0.3c3712b2NaHUdY 点击下载或者复制链接到迅雷下载 下载好以后 ...
- ============================================ 新的开始(前后端分离项目学习Vue+DRF)
- WPF绑定资源文件错误(error in binding resource string with a view in wpf)
报错:无法将"***Properties.Resources.***"StaticExtension 值解析为枚举.静态字段或静态属性 解决办法:尝试右键单击在Visual Stu ...
- 【图像处理】使用OpenCV+Python进行图像处理入门教程(二)
这篇随笔介绍使用OpenCV进行图像处理的第二章 图像的运算,让我们踏上继续回顾OpenCV进行图像处理的奇妙之旅,不断地总结.回顾,以新的视角快速融入计算机视觉的奥秘世界. 2 图像的运算 复杂的 ...
- LeetCode-二叉树的镜像
二叉树的镜像 二叉树的镜像 给定一个二叉树,输出二叉树的镜像. 只需要使用一个简单的递归,分别对左右子树反转后再对当前结点进行反转. #include<iostream> #include ...
- 创建一个scrapy爬虫框架的项目
第一步:打开pycharm,选择"terminal",如图所示: 第二步:在命令中端输入创建scrapy项目的命令:scrapy startproject demo (demo指的 ...