题目链接

Description

三塔汉诺塔问题,给一个 \(3 \times 3\) 的矩阵 \(t\),\(t_{i, j}\) 表示从 \(i\) 塔移动一个盘子到 \(j\) 塔的花费。

初始状态 \(n\) 个盘子都在第一个盘子,要求将所有的移到第三个盘子,求最小花费。

Solution

显然可以间接移动,花费有可能更优,先用 Floyd 算法算出从 \(i\) 间接 / 直接移动到 \(j\) 的最小花费,设 \(d_{i,j}\) 表示从 \(i\) 到 \(j\) 的最小花费。

显然无后效性,考虑 \(dp\)。

状态设计

设 \(f_{i,a,b}\) 表示将 \(i\) 个盘子从 \(a\) 移动到 \(b\) 的最小花费。

初始状态

\(f_{1, a, b} = d_{a,b}\) 其余为正无穷

状态转移

不妨设另外一个盘子为 \(c\)。

先把 \(n\) 个盘子看做两个整体:第 \(n\) 个盘子和 \(n - 1\) 个盘子,这样可以 DP 了。

通过观察发现有两个可能成为最优的转移方式:

  • 将 \(n - 1\) 个盘子 \(a \Rightarrow c\),第 \(n\) 个盘子 \(a \Rightarrow b\),然后再把 \(n - 1\) 个盘子 \(c \Rightarrow b\)。
  • \(n - 1\) 个盘子 \(a \Rightarrow b\),第 \(n\) 个盘子 \(a \Rightarrow c\),\(n - 1\) 个盘子 \(b \Rightarrow a\),第 \(n\) 个盘子 \(c \Rightarrow b\),\(n - 1\) 个盘子 \(a \Rightarrow b\)。

其他的转移一定是这两种 + 反复横跳形成的。

将上面的方式翻译一下,即:

  • \(f_{i, a, b} \gets f_{i - 1, a,c} + t_{a,b} + f_{i - 1, c, b}\)

  • \(f_{i, a, b} \gets f_{i - 1, a,b} + t_{a,c} + f_{i - 1, b, a} + t_{c,b} + f_{i - 1, a, b}\)

值得注意的是这里不能用 \(d\),因为其他盘子不是空的,不能作为间接量。

时间复杂度

\(O(N)\)

Tips

注意开 long long !

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; const int N = 45; typedef long long LL; int t[3][3], g[3][3], n;
LL f[N][3][3]; int main() {
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++) scanf("%d", &t[i][j]), g[i][j] = t[i][j];
scanf("%d", &n);
for (int k = 0; k < 3; k++)
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
t[i][j] = min(t[i][j], t[i][k] + t[k][j]);
memset(f, 0x3f, sizeof f);
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
f[1][i][j] = t[i][j]; for (int i = 2; i <= n; i++) {
for (int a = 0; a < 3; a++) {
for (int b = 0; b < 3; b++) {
if (a == b) continue;
int c = 3 - a - b;
f[i][a][b] = min(f[i - 1][a][c] + g[a][b] + f[i - 1][c][b], f[i - 1][a][b] + g[a][c] + f[i - 1][b][a] + g[c][b] + f[i - 1][a][b]);
}
}
}
printf("%lld\n", f[n][0][2]);
return 0;
}

CF392B Tower of Hanoi的更多相关文章

  1. poj 3601 Tower of Hanoi

    Tower of Hanoi Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 1853   Accepted: 635 De ...

  2. python递归三战:Sierpinski Triangle、Tower of Hanoi、Maze Exploring

    本文已做成视频教程投稿b站(视频版相对文本版有一些改进),点击观看视频教程 本文主要通过三个实例来帮助大家理解递归(其展示动画已上传B站): 谢尔宾斯基三角形(Sierpinski Triangle) ...

  3. 汉诺塔问题(The Tower of Hanoi)的递归算法与非递归算法

    非递归算法: 根据圆盘的数量确定柱子的排放顺序: 若n为偶数,按顺时针方向依次摆放 A B C: 若n为奇数,按顺时针方向依次摆放 A C B. 然后进行如下操作: (1)按顺时针方向把圆盘1从现在的 ...

  4. Tower of Hanoi问题

    [问题描述] 有A, B, C三个塔座,A上套有n个直径不同的圆 盘,按直径从小到大叠放,形如宝塔,编号1, 2, 3 … n. 要求将n个圆盘从A移到C,叠放顺序不变,移动过程中遵循 下列原则: w ...

  5. [POJ1958][Strange Tower of Hanoi]

    题目描述 求解 \(n\) 个盘子 \(4\) 座塔的 Hanoi 问题最少需要多少步 问题分析 考虑 \(3\) 座塔的 Hanoi 问题,记 \(f[i]\) 表示最少需要多少步, 则 \(f[i ...

  6. One usage of recurison: the tower of Hanoi

    Statements: This blog was written by me, but most of content  is quoted from book[Data Structure wit ...

  7. 汉诺塔 Tower of Hanoi

    假设柱子标为A,B.C.要由A搬至C,在仅仅有一个盘子时,就将它直接搬至C:当有两个盘子,就将B作为辅助柱.假设盘数超过2个.将第二个下面的盘子遮起来,就非常easy了.每次处理两个盘子,也就是:A- ...

  8. codeforces 392B Tower of Hanoi

    把前n个碟子从第一个塔移动到第三个塔有两种方法: 1.把前n-1个移动到第二个塔,把第n个移动到第三个塔,然后把前n-1个从第二个移动到第三个: 2.把前n-1个移动到第三个塔,把第n个移动到第二个塔 ...

  9. codeforces392B

    CF392B Tower of Hanoi 题意翻译 河内塔是一个众所周知的数学难题.它由三根杆和一些可以滑动到任何杆上的不同尺寸的圆盘组成.难题从一个整齐的杆中开始,按照尺寸从小到大的顺序排列,最小 ...

随机推荐

  1. 配置内网访问的TV

    前言 通过内网模式访问tv远程机器 方法 云主机配置 一台云主机,云主机申请两个公网IP 云主机启动两个frps进程绑定到两个内网的ip 客户端配置 远程一台linux跳板机运行frpc,启动两个进程 ...

  2. 解决自动安装Freebsd系统盘符无法确定问题

    最近因为需要用到Freebsd,所以研究了打包的一些方法,这个没什么太大问题,通过网上的一些资料可以解决,但是由于确实不太熟悉这套系统,还是碰上了一些比较麻烦的地方,目前也没看到有人写如何处理,那就自 ...

  3. Notepad++安装教程

        1.官网下载 官方网站:https://notepad-plus-plus.org/downloads/ 上面有历史版本,一般就选择最新版下载 2.安装 [3]打开记事本进行设置: 设置--& ...

  4. 不同角度看Handler——另类三问

    之前有一章节介绍了Handler的常见面试题,今天就来说说另类的,可能你没关注的其他问题,一起看看吧. 系统为什么提供Handler 这点大家应该都知道一些,就是为了切换线程,主要就是为了解决在子线程 ...

  5. 前端知识之HTML标签

    1.HTML是一个标准,规定了大家怎么写网页. 2.HTML->>学标签 <标签名>    -->  标记语言(HTML.XML) 3.标签分类 双标签.单标签 (1)& ...

  6. 实验吧[WEB]——程序逻辑问题

    拿到题 通过查看网页源代码发现index.txt 通过index.txt我们获得了后端的源代码 我们可以通过我画出来的这两个重要的信息得知 第一个sql查询语句没有任何过滤说明存在SQL注入漏洞. 第 ...

  7. sqlilab less32-less37

    less-32 过滤了单引号,双引号,斜杠,同时设置数据库为GBK编码,可以考虑宽字节注入, 当设置gbk编码后,遇到连续两个字节,都符合gbk取值范围,会自动解析为一个汉字.用脚本来测试下哪些符合 ...

  8. 使用iOS 设备管理器 iMazing导出苹果设备中的录音文件

    iMazing是一款功能强大的苹果设备管理软件,能为用户提供便捷的录音文件导出功能.用户可以直接将录音文件从苹果设备中导出,接下来,就让小编为大家演示一下如何操作吧. 图1:iMazing界面 1.打 ...

  9. 让mac电脑更简单运行Windows软件的CrossOver,优势知多少?

    如今,一些iPhone和iPad机型拥有Face ID功能,此功能作用允许用户通过面部识别来解锁设备.该功能还不能在Mac上使用,但是国外媒体于7月27日报道称,在公测第三版的macOS Big Su ...

  10. 对于MySQL数据库四种隔离等级

    对于MySQL事务有四种隔离级别,分别是以下四种: 1.读未提交 2.读提交 3.可重复读 4.串行化(加锁) 对于隔离我们都是说在并发的情况下发生的事情,读取的数据在并发的情况下会发生什么情况. 并 ...