动态规划:汉诺塔问题|循环汉诺塔

目录

1. 汉诺塔游戏简介

2.算法原理

3.循环汉诺塔


1. 汉诺塔游戏简介

汉诺塔游戏是一个经典的数学智力游戏,其目标是将塔上不同大小的圆盘全部移动到另一个塔上,且在移动过程中必须遵守以下规则:

  • 每次只能移动一个圆盘
  • 较大的圆盘不能放在较小的圆盘之上

2.算法原理

假设是三个塔ABC,A塔上有n个圆盘,求最少需要移动多少次可以将A塔的圆盘全部移到C塔上

设最少移动次数的函数为f(n)

(1)n=1时,只需要一步,直接将A塔上的圆盘移到C塔 即 f(1)= 1

(2)n=2时,,看下图可知 f(2)= 3

(3)n=3时,看下图可知 f(3)= 7

找规律可发现:思路简要如下:将移动步骤分为三步,

a)将最上面的n-1个盘子从A塔移动到B塔上

b)将最大的盘子移动到C塔上

c)再将B塔上的n-1个盘子移动到C塔上

当n=3时:将上面两个圆盘一同移到B塔其实就是n=2时的整个步骤,因为都是将2个圆盘一起移到另一个塔上,那么n=3就可以这样看

a)第1-3步:将上面2个盘放到B塔上,即f(2)步

b)第4步:将最大的盘子移动到C塔上,就+1步

c)第5-7步:将B塔上的2个盘移到C塔上,也是f(2)步

由此推导:n=3时最少移动次数:f(3) = f(2)+1+f(2)=2*f(2)+1

n继续变化推导出:f(n)=2*f(n-1)+1

那么动态规划算法的代码:

 /**** @param n 代表汉诺塔阶数* @return 返回最少移动次数*/public int getHanoi(int n) {if(n == 1) {return 1;}int[] data = new int[n];data[0] = 1;for(int i = 1; i < n; i++){data[i] = data[i-1] + 1 + data[i-1];}return data[n-1];}

3.循环汉诺塔

这题有两问:

(1)把A塔上的所有圆盘都移到B塔所需的最小步数

(2) 把A塔上的所有圆盘都移到C塔所需的最小步数

区别:只能从A->B,B->C,C->A不能随意挪动圆盘

算法原理同上

 上图左:f(2) 图右:g(2) 

移到B塔所需的最小步数:f(n)移到C塔所需的最小步数:g(n)
n=112
n=22+1+2=52+1+1+1+2=7
n=3g(2)+1+g(2)=15g(2)+1+f(2)+1+g(2)=21

此处来分析n=3:怎么找重复子问题

(1)移到B塔所需的最小步数:f(3)

a)将上面2个盘移动C塔:A->B,B->C这个过程其实就是g(2)

b)将最大的盘子移动到B塔上:+1步

c)将C塔上2个盘移动到B塔上:C->A,A->B其实也就是g(2)

(2)移到C塔所需的最小步数:g(3)

a)将上面2个盘移动C塔:A->B,B->C这个过程其实就是g(2)

b)将最大的盘子移动到B塔上:+1步

c)将C塔上面2个盘移动A塔:C->A这个过程其就是f(2)

d)将最大的盘子移动到C塔上:+1步

e)将A塔上面2个盘移动C塔:A->B,B->C这个过程其实就是g(2) 

综上进一步推导:

f(n)= 2*g(n-1)+1

g(n)=2*g(n-1)+f(n-1)+2

代码如下:

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int mod = 1000000007;int x =1,y = 2;for(int i=2;i<=n;i++) {int xx = x,yy=y;x= (2*yy+1) % mod;y = ((2*yy)%mod+2+xx)%mod;}System.out.print(x+" "+y);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/53769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css百分比布局中height:100%不起作用

百分比布局时&#xff0c;我们有时候会遇到给高度 height 设置百分比后无效的情况&#xff0c;而宽度设置百分比却是正常的。 当为一个元素的高度设定为百分比高度时&#xff0c;是相对于父元素的高度来计算的。当没有给父元素设置高度&#xff08;height&#xff09;时或设置…

杂七杂八-系统环境安装

杂七杂八-系统&环境安装 1. 系统安装2. 环境安装 仅个人笔记使用&#xff0c;后续会根据自己遇到问题记录&#xff0c;感谢点赞关注 1. 系统安装 Windows安装linux子系统WSL2&#xff1a;使用windows系统跑linux程序(大模型)WSL VSCode&#xff1a;VSCode连接WSL实现高效…

就服务器而言,ARM架构与X86架构有什么区别?各自的优势在哪里?

一、服务器架构概述 在数字化时代&#xff0c;服务器架构至关重要。服务器是网络核心节点&#xff0c;存储、处理和提供数据与服务&#xff0c;是企业和组织信息化、数字化的关键基础设施。ARM 和 x86 架构为服务器领域两大主要架构&#xff0c;x86 架构服务器在市场占主导&…

学习之git的团队协作

git团队协作 一 团队内协作 生成SSH公钥私钥 一&#xff08;跨团队协作&#xff09;

jmeter之仅一次控制器

仅一次控制器作用&#xff1a; 不管线程组设置多少次循环&#xff0c;它下面的组件都只会执行一次 Tips&#xff1a;很多情况下需要登录才能访问其他接口&#xff0c;比如&#xff1a;商品列表、添加商品到购物车、购物车列表等&#xff0c;在多场景下&#xff0c;登录只需要…

【GBase 8c V5_3.0.0 分布式数据库常用维护命令】

一、查看数据库状态/检查&#xff08;gbase用户&#xff09; 1.gha_ctl monitor 使用gha_ctl monitor查看节点运行情况(跟dcs的地址和端口) gha_ctl monitor -c gbase -l http://172.20.10.8:2379 -Hall |coordinator | datanode | gtm | server|dcs:必选字段。指定查看哪类集…

程序员转行方向推荐

程序员转行方向推荐是一个涉及个人兴趣、技能匹配及市场需求等多方面因素的复杂话题。以下是一些详细的转行方向推荐&#xff0c;旨在帮助程序员在职业生涯中做出更加明智的选择。CSDN大礼包&#xff1a;《2024年最新全套学习资料包》免费分享 技术管理岗位 推荐理由&#xf…

崩坏星穹铁道PC端2.5版本剧情、奖励攻略 用GameViewer远程帮手机减负 随时畅玩星铁PC端

《崩坏&#xff1a;星穹铁道》2.5版本「碧羽飞黄射天狼」在9月10开启&#xff01;上半卡池有五星角色飞霄、知更鸟、卡芙卡、黑天鹅四位角色&#xff0c;还有2.5版本的新剧情&#xff0c;这一次崩铁上线送10连和 1000星琼等其他材料。由于游戏包体过大&#xff0c;不少玩家都选…

光伏开发:工商业光伏的流程管理全面解析

一、项目准备阶段 1、资源寻觅与沟通 首要任务是寻找适合的工商业屋顶或空地资源&#xff0c;并与业主初步交流&#xff0c;了解其意向、屋顶条件及用电情况。这一阶段的关键在于建立信任关系&#xff0c;为后续工作奠定基础。 2、资料收集与核查 全面收集业主资料&#xff…

2.ChatGPT的发展历程:从GPT-1到GPT-4(2/10)

引言 在人工智能领域&#xff0c;自然语言处理&#xff08;NLP&#xff09;是连接人类与机器的重要桥梁。随着技术的不断进步&#xff0c;我们见证了从简单的文本分析到复杂的语言理解的转变。ChatGPT&#xff0c;作为自然语言处理领域的一个里程碑&#xff0c;其发展历程不仅…

2_foc闭环调试_ADC电流采样与滤波及pid数据结构

1、ADC电流采样 上次添加了编码器获取电角度的程序&#xff0c;将之前开环控制的角度进行了替换&#xff0c;这次再将电流采样添加进来&#xff0c;之后就可以利用这样一个有反馈的系统进行电流环PI控制器参数调试。 之前写过ADC&#xff0b;DMA电流采样的stm32库函数程序&…

PPT中的图形与图片:插入、调整与格式设置技术详解

目录 引言 一、图形与图片的插入 1. 插入图形 2. 插入图片 二、图形与图片的调整 1. 调整大小与位置 2. 裁剪与旋转 3. 图形与图片的合并与组合 三、图片格式与布局设置 1. 图片格式设置 2. 图片布局设置 示例案例&#xff1a;制作产品展示PPT 四、结论 引言 在现…

浏览器查消息

window.addEventListener(message,function(event){console.log(Received message,event.data)}); 并把弹窗口对准要接收消息的ifrme 发消息的窗口

20240914 每日AI必读资讯

刚刚&#xff0c;OpenAI震撼发布o1大模型&#xff01;强化学习突破LLM推理极限 - OpenAI o1模型需要简单、直接的提示&#xff0c;而非复杂的指导。 - 避免使用思路链提示&#xff0c;因为o1模型已经具备内部推理能力。 - 使用分隔符来明确模型解析的部分&#xff0c;并限制…

网络编程Udp协议

文章目录 UDP协议1、什么是UDP协议&#xff1f;一、定义与基本概念二、主要特点三、报文格式四、应用场景五、总结 2、如何使用Java中的UDP套接字&#xff1f;一、UDP常用APIDatagramSocketDatagramPacket 二、UDP协议下的客户端-服务器服务器客户端 UDP协议 UDP协议&#xff…

微软发布Win11 24H2 九月累计更新补丁KB5043080!

系统之家于9月13日发出最新报道&#xff0c;微软面向Win11 24H2用户推送了九月最新更新补丁KB5043080&#xff0c;系统更新后&#xff0c;版本号将升至26100.1742。本次更新解决了任务管理器不正确显示的情况&#xff0c;还进行了多项改进。接下来&#xff0c;跟随小编一起深入…

小程序的右侧抽屉开关动画手写效果

<template><view><button click"openDrawer">打开抽屉</button><view v-if"showDrawer" class"drawer" :style"{ backgroundColor: bgColor }" click"closeDrawer"><view class"draw…

微信小程序登录与获取手机号 (Python)

文章目录 相关术语登录逻辑登录设计登录代码 相关术语 调用接口[wx.login()]获取登录凭证&#xff08;code&#xff09;。通过凭证进而换取用户登录态信息&#xff0c;包括用户在当前小程序的唯一标识&#xff08;openid&#xff09;、微信开放平台账号下的唯一标识&#xff0…

Unity 之 【Android Unity FBO渲染】之 [Unity 渲染 Android 端播放的视频] 的一种方法简单整理

Unity 之 【Android Unity FBO渲染】之 [Unity 渲染 Android 端播放的视频] 的一种方法简单整理 目录 Unity 之 【Android Unity FBO渲染】之 [Unity 渲染 Android 端播放的视频] 的一种方法简单整理 一、简单介绍 二、FBO 简单介绍 三、案例实现原理 四、注意事项 五、简…

利用熵权法进行数值评分计算——算法过程

1、概述 在软件系统中&#xff0c;研发人员常常遇上需要对系统内的某种行为/模型进行评分的情况。例如根据系统的各种漏洞情况对系统安全性进行评分、根据业务员最近操作系统的情况对业务员工作状态进行打分等等。显然研发人员了解一种或者几种标准评分算法是非常有利于开展研…