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

news2024/11/18 11:24:08

目录

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.coloradmin.cn/o/2133058.html

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

相关文章

linux cmake版本升级教程(Centos7)

有时候,当前系统的cmake版本,并一定能满足编译要求,所以需要进行升级到高于某个版本才能正常编译。本章教程,主要在centos7上进行升级cmake版本。 一、查看当前的cmake版本 cmake --version二、下载指定版本的cmake wget https://github.com/Kitware/CMake/releases/down…

2.2 vc-align源码分析 -- ant-design-vue系列

vc-align源码分析 源码地址&#xff1a;https://github.com/vueComponent/ant-design-vue/tree/main/components/vc-align 1 基础代码 1.1 名词约定 需要对齐的节点叫source&#xff0c;对齐的目标叫target。 1.2 props 提供了两个参数&#xff1a; align&#xff1a;对…

华为ensp中vlan与静态路由技术的实现

vlan 同一网段的设备&#xff0c;可以互通&#xff1b; 虚拟局域网&#xff1a;将局域网从逻辑上划分为多个局域网&#xff0c;不同通过vlan编号区分&#xff1b; 实现网络隔离。提高了网络安全性&#xff1b; vlan编号为12位&#xff1b; 范围1-4094可以用来配置 默认处于…

3.2 Upload源码分析 -- ant-design-vue系列

Upload源码分析 – ant-design-vue系列 源码地址&#xff1a;https://github.com/vueComponent/ant-design-vue/blob/main/components/upload/Upload.tsx 1 概述 本篇是对Upload组件的分析&#xff0c;这个组件调用了vc-upload&#xff0c;是对vc-upload的封装。 作用包括&…

【【通信协议之ICMP协议】】

【【通信协议之ICMP协议】】 下面先展示出ICMP协议的数据格式 用户数据打包在 ICMP 协议中&#xff0c;ICMP 协议又是基于 IP 协议之上的&#xff0c;IP 协议又是走 MAC 层发送的&#xff0c;即从包含关系来说&#xff1a;MAC 帧中的数据段为 IP 数据报&#xff0c;IP 报文中…

LCSS—最长回文子序列

思路分析 关于”回文串“的问题&#xff0c;是面试中常见的&#xff0c;本文提升难度&#xff0c;讲一讲”最长回文子序列“问题&#xff0c;题目很好理解&#xff1a; 输入一个字符串 s&#xff0c;请找出 s 中的最长回文子序列长度。 比如输入 s"aecda"&#xff0c…

【数据结构】字符串与JSON字符串、JSON字符串及相应数据结构(如对象与数组)之间的相互转换

前言&#xff1a; 下面打印日志用的是FastJSON依赖库中的 Log4j2。依赖&#xff1a; <!-- Alibaba Fastjson --> <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.80</version> …

prometheus 集成 grafana 保姆级别安装部署

前言 本文 grafana 展示效果只需要 prometheus node_exporter grafana 其他的选择安装 环境和版本号 系统: CentOS 7.9 prometheus: 2.54.1 pushgateway: 1.9.0 node_exporter: 1.8.2 alertmanager: 0.27.0 grafana:11.2.0 官网:https://prometheus.io/ 下载地址:h…

算法基础-二分查找

左闭右闭 [ left&#xff0c;right ] [1,1]可以 while( left < right ) if( a[mid] > target ) right mid - 1 else if( a[mid] < target ) left mid 1 左闭右开 [ left&#xff0c;right ) …

工业平板电脑轻薄与耐用并存

在现代工业环境中&#xff0c;工业平板电脑的应用越来越广泛。它们不仅需要具备轻薄的设计以便于携带和操作&#xff0c;还必须具备耐用性以应对恶劣的工作条件。 一、工业平板电脑的定义与特点 工业平板电脑是一种专为工业环境设计的计算设备&#xff0c;通常具备防尘、防水、…

MySQL分页查询(DQL)

因DataGrip我的激活到期&#xff0c;也没太多精力去破解&#xff0c;最后换了Navicat&#xff0c;实际上操作是一样的&#xff0c;不变。 先看我的表数据&#xff0c;以我的数据作为例子 基本语法 select 字段列表 from 表名 起始索引&#xff0c;查询记录数。 1.查询第1页员…

[数据集][目标检测]车油口挡板开关闭合检测数据集VOC+YOLO格式138张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;138 标注数量(xml文件个数)&#xff1a;138 标注数量(txt文件个数)&#xff1a;138 标注类别…

期权组合策略有什么风险?期权组合策略是什么?

今天期权懂带你了解期权组合策略有什么风险&#xff1f;期权组合策略是什么&#xff1f;期权组合策略是通过结合不同期权合约&#xff08;如看涨期权和看跌期权&#xff09;&#xff0c;以及标的资产&#xff08;如股票&#xff09;来实现特定投资目标的策略。 期权组合策略市…

2024.9.13 重拾数据库,不用就忘T-T

在之前学习Web的时候&#xff0c;电脑安装过mysql和navicate&#xff0c;所以安装步骤跳过 直接使用navicate创建一个新的连接&#xff0c;然后在这个连接里面新建数据库 新建数据库弹出要求如下图 一般的数据库学习教程都是字符集选择utf-8&#xff08;有中文&#xff09;&a…

PyTorch安装指南:轻松上手深度学习框架(CUDA)

PyTorch 是一个非常流行的开源深度学习框架&#xff0c;它支持动态图&#xff0c;这使得开发者能够更容易地构建和调试复杂的模型。PyTorch 可以运行在 CPU 上&#xff0c;也可以利用 NVIDIA 的 CUDA 平台加速计算&#xff0c;从而在 GPU 上执行。下面是如何在你的系统上安装 P…

JS面试真题 part5

JS面试真题 part5 21、说说对事件循环的理解22、JavaScript本地存储方式有哪些&#xff1f;区别及应用场景&#xff1f;23、大文件上传如何断点续传&#xff1f;24、ajax原理是什么&#xff1f;如何实现&#xff1f;25、什么是防抖和节流&#xff1f;有什么区别&#xff1f;如何…

如何在Windows10系统安装docker?

1.wsl安装 Windows Subsystem for Linux(简称WSL)是一个在Windows 10\11上能够运行原生Linux二进制可执行文件(ELF格式)的兼容层。它是由微软与Canonical公司合作开发,开发人员可以在 Windows 计算机上同时访问 Windows 和 Linux 的强大功能。 通过适用于 Linux 的 Window…

UE5 阴影通道

Shadow Pass Switch节点中 Default代表模型遮罩的效果 Shadow代表阴影的生成遮罩效果

Web开发:使用C#创建、安装、调试和卸载服务

目录 一、创建服务 1.创建项目&#xff08;.NET Framework&#xff09; 2.重命名 3.编写逻辑代码 二、安装服务 1.方案一&#xff1a;利用VS2022安装文件的配置 选择添加安装程序 安装文件的介绍及配置 ​编辑​ 重新编译 工具安装 2.方案二&#xff1a;编写bat脚本安…

SCRM电商管理后台Axure高保真原型 源文件

在电商行业蓬勃发展的今天&#xff0c;企业急需一个全面的客户关系管理&#xff08;CRM&#xff09;系统来优化他们的电商运营。我们的Scrm电商管理后台应运而生&#xff0c;它不仅是一个集中化的管理平台&#xff0c;更是企业提升客户互动和销售业绩的得力助手。 预览地址 ht…