多柱汉诺塔(Matrix上选做题)——递归与动态规划

2023-11-19

多柱汉诺塔

分析:
对于三柱汉诺塔问题,我们已经熟知步骤数最优解为 2 i − 1 2^{i}-1 2i1,其中 i 为盘子个数。
对于四柱以上的问题,我们将柱子分为三类,起点柱Start,辅助柱Buf,终点柱End,三柱情况时,我们总想着将前n - 1个盘从Start借助End移动到Buf,然后将第 n 个盘从Start移到End,最后将Buf柱上的n - 1个盘借助Start移到End,这就找到了递推关系:
S t e p s ( n ) = 2 ∗ S t e p s ( n − 1 ) + 1 Steps(n) = 2*Steps(n-1)+1 Steps(n)=2Steps(n1)+1
对于三柱问题,我们将前n-1盘移到Buf是唯一的选择,对于四柱以上的问题,我们可以移前n-1或者前n-2等等,哪个最佳呢?这就需要动态规划了。
思路:
这里提供Frame算法:
由于不知道哪个 r 使得移动前 n - r 个盘是最优解,我们需要算出所有可能性再取最小值。

(1)首先把前 n - r 个盘移从Strat移到Buf上,此时可用柱数为 m ,步骤数是 S t e p s ( m , n − r ) Steps(m,n-r) Steps(m,nr)

(2)再将剩下的 r 个盘从Start移到End上,由于上述步骤占用了1根柱子步骤数是 S t e p s ( m − 1 , r ) Steps(m - 1,r) Steps(m1r)

(3)最后将第一步的 n - r 个盘从Buf移到End上,虽然End柱被占用,但其中的盘均比这 n - r 个大,故可用柱子数仍为 m ,步骤数是 S t e p s ( m , n − r ) Steps(m,n-r) Steps(mnr)

(4)依据上边规则求出所有 r ( 1 ≤ r ≤ n ) r(1≤r≤n) r1rn情况下步数,取最小值得最终解。

因此Frame算法的递归方程如下:

S t e p s ( m , n ) = m i n ( 2 ∗ S t e p s ( m , n − r ) + S t e p s ( m − 1 , r ) ) , ( 1 ≤ r ≤ n ) 。 Steps(m,n)=min(2*Steps(m,n-r)+Steps(m-1,r)),(1≤r≤n)。 Steps(m,n)=min(2Steps(m,nr)+Steps(m1,r))1rn

于是有下列代码:

#include <stdio.h>
#include <math.h>

long long min_steps(int m,int n);

long long min(long long a,long long b);

int main() {
	int m,n;
	scanf("%d %d",&m,&n);
	printf("%lld\n",min_steps(m,n));
} 
long long min_steps(int m,int n) {
	
	if(n == 0) return 0;//若盘子数为0,无论柱子数为多少,移动步数都是0
	if(n == 1) return 1;//若盘子数为1,无论柱子数为多少,移动步数都是1
	if(n == 2) return 3;//若盘子数为2,无论柱子数为多少,移动步数都是2
	
	if(m == 3) return (long long)pow(2,n) - 1;//若柱子数为3,就是经典的三柱汉诺塔问题
	
	else if(m > 3){//四柱及以上汉诺塔问题
		long long mini = (long long)pow(2,30);//预设一个比较大的值,方便下面取最小值不出错
		for(int i = 1;i <= n;i ++) {	
			mini = min(mini,2*min_steps(m,n-i)+min_steps(m-1,i));
		}//动态规划
		return mini;
	}
} 
long long min(long long a,long long b) {
	if(a <= b) return a;
	else return b;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多柱汉诺塔(Matrix上选做题)——递归与动态规划 的相关文章

随机推荐

  • C++仿函数

    1 仿函数的定义 仿函数简单说就是在类中定义的特殊函数 没有函数名 或者说函数名统一为 operation 或者可以认为是重载运算符 格式为 返回类型 operator 参数列表 定义了仿函数的对象 可以直接通过下面格式调用仿函数 对象名
  • 异步加载vue组件

    什么时候使用 组件较大 或者不是必用的 通常组件在script标签对中导入 而异步组件在component中使用 例如 components ForData gt import view Fordata
  • J2EE集合框架

    1 UML 二 集合的基本特点 list集合的特点 增删改查 有序 可重复 三 List集合的三种遍历方式 for foreath iterator 四 ArrayList LinkedList 的比较与分析 比较 1 ArrayList
  • 基于Matlab的灰狼算法优化LSTM风电功率预测

    基于Matlab的灰狼算法优化LSTM风电功率预测 随着可再生能源的快速发展 风能作为一种重要的清洁能源形式变得越来越受关注 风电功率预测在风电场的运营和调度中起着关键作用 然而 由于风速的不稳定性和不确定性 精确地预测风电功率仍然具有一定
  • SpringCloud Gateway:status: 503 error: Service Unavailable

    使用SpringCloud Gateway路由请求时 出现如下错误 yml配置如下 可能的一种原因是 yml配置了gateway discovery locator enabled true 此时gateway会使用负载均衡模式路由请求 但
  • Lim接口测试平台-接口测试功能详解

    一 接口测试 项目地址 Gitee Github 接口测试模块是整个Lim平台的核心 左侧是接口的模块树 右侧顶部是用例操作功能区 列表展示接口用例信息 文章目录 一 接口测试 二 维护接口用例 各步骤类型详解 1 执行步骤 1 接口步骤
  • Unity --- 触摸方法,以及灯光与烘培的使用

    触摸方法 1 首先触摸分为两大类 多点触摸和单点触摸 这两种方式的触摸通过下面这个触摸数来进行判断 当其等于1的时候 为单点触摸 当其大于1的时候为多点触摸 2 当我们在调用触摸方法的时候我们首先需要打开对应的多点 单点触摸 上面这个是开启
  • QObject的d_ptr成员——箭头符号的重载

    QObject中的d ptr是这样定义的 QScopedPointer
  • vscode cmake 编译32位程序

    vscode cmake 编译32位程序 为什么要用cmake vscode中的C C 插件直接支持的只是最简单的单文件编译 运行和调试 要管理大的项目 或者生成库 C C 插件不能直接支持 需要开发者利用vscode的task功能 结合脚
  • 【由浅入深】爬虫技术,值得收藏,来了解一下~

    爬虫技术 来了解一下 一 为什么需要爬虫技术 现在的互联网来说 包含着各种海量的信息 无孔不入 包罗万象 出于数据分析或产品需求 我们需要从某些网站 提取出我们感兴趣 有价值的内容 我们需要一种能自动获取网页内容并可以按照指定规则提取相应内
  • 关于两数交换的两种方法

    目录 前言 一 引入变量 这个方法也是最常用的方法 二 通过使用数学的方法相加或者相减从而得到两数运算 这种方法不常见 总结 前言 从键盘输入两个整数 并交换两位数字 这里小编用两种方法告诉大家 注意小编这里用的是VS2019 所以在代码的
  • STM32 --通用定时器输入捕获功能

    问题 开始的时候没有搞清楚 定时器时基 于 定时器溢出中断的概念 导致在计算频率的时候一直有问题 开始并没有怀疑是配置有问题 因为之前接触过定时器输入捕获功能 靠着自己的记忆配置了一下 认为 捕获功能 的定时是通过定时器设置的定时溢出频率来
  • 栈实现队列(继续细起来啊)

    生命不是要等待风暴过去 而是要学会在风暴中跳舞 卡莉尔 吉布朗目录 一 栈实现队列 二 使用两个栈实现队列的功能 1 在队列的结构体中创建两个栈 2 创建一个队列的结构体指针 3 myQueuePush入队列操作 4 myQueuePeek
  • SpringBoot项目实战(一)

    SpringBoot实战之系统架构 1 系统介绍 该实战项目 是一个B2C模式的职业技能在线教育系统 分为前台用户系统和后台运营平台 前台用户系统包括课程 问答 文章三大部分 后台运营平台包括会员管理 讲师管理 课程管理 文章资讯 统计分析
  • Gradle入门(二)尝试理解gralde编译项目

    前言 前面我们了解了如何通过groovy DSL转换为KTS 我也在尝试的证明可以看到源码和有代码提示对于入门的重要性 2022年11月12日 我发现最新的idea 有gradle的代码提示 点击也可以看到源码 学习Gradle还是建议整一
  • .NET框架和发展历史介绍

    NET框架知识 NET 框架是由微软开发的软件开发平台 其最主要的两个组成部分是公共语言运行时 CLR 和框架类库 FCL 基础类库 BCL 是框架类库的一个子集 NET框架的主要结构如下图所示 1 操作系统 最下层的无疑就是操作系统了 2
  • Linux内核之pid为0和pid为1【转】

    转自 https blog csdn net jingyilin2008 article details 7815508 ops request misc 257B 2522request 255Fid 2522 253A 25221592
  • 【Linux】Mint20.3系统安装Anaconda环境

    Anaconda是非常方便的python开发IDE环境 其中不仅包含了很多常用python库还有Spyder运行环境 Mint系统是近些年非常受欢迎的linux系统 易上手已操作特性使其普及非常快 本篇介绍在Mint20 3系统安装Anac
  • haclcon实现图像处理的傅里叶变换

    dev open file dialog read image default default Selection read image Image Selection mean image Image ImageMean 9 9 gaus
  • 多柱汉诺塔(Matrix上选做题)——递归与动态规划

    分析 对于三柱汉诺塔问题 我们已经熟知步骤数最优解为 2 i 1 2 i 1 2i 1 其中 i 为盘子个数 对于四柱以上的问题 我们将柱子分为三类 起点柱Start 辅助柱Buf