【回溯】符号三角形问题Python实现

文章目录

    • @[toc]
      • 问题描述
      • 回溯法
      • 时间复杂性
      • `Python`实现

因上努力

个人主页:丷从心

系列专栏:回溯法

果上随缘


问题描述

  • 下图是由 14 14 14个“ + + +”和 14 14 14个“ − - ”组成的符号三角形, 2 2 2个同号下面都是” + + +“, 2 2 2个异号下面都是“ − -

1

  • 在一般情况下,符号三角形的第一行有 n n n个符号,符号三角形问题要求对于给定的 n n n,计算有多少个不同的符号三角形,使其所含的“ + + +”和“ − - ”的个数相同

回溯法

  • 对于符号三角形问题,用 n n n元组 x [ 1 : n ] x[1 : n] x[1:n]表示符号三角形的第一行的 n n n个符号,由于 x [ i ] x[i] x[i]是二值的,所以在用回溯法解符号三角形问题时,可以用一棵完全二叉树来表示其解空间
  • 在符号三角形的第一行的前 i i i个符号 x [ 1 : i ] x[1 : i] x[1:i]确定后,就确定了一个由 i ( i + 1 ) / 2 i (i + 1) / 2 i(i+1)/2个符号组成的符号三角形,下一步确定 x [ i + 1 ] x[i + 1] x[i+1]的值后,只要在前面已确定的符号三角形的右边加一条边,就可以扩展为 x [ 1 : i + 1 ] x[1 : i + 1] x[1:i+1]相应的符号三角形
  • 最终由 x [ 1 : n ] x[1 : n] x[1:n]所确定的符号三角形中包含的“ + + +”个数与“ − - ”个数同为 n ( n + 1 ) / 4 n (n + 1) / 4 n(n+1)/4,因此在回溯搜索过程中,可用当前符号三角形所包含的“ + + +”个数与” − - “个数均不超过 n ( n + 1 ) / 4 n (n + 1) / 4 n(n+1)/4作为可行性约束,用于剪去不满足约束的子树
  • i = n i = n i=n时,算法搜索至叶节点,得到一个新的“ + + +”个数与“ − - ”个数相同的符号三角形,当前已找到符号三角形数 s u m sum sum 1 1 1
  • i < n i < n i<n时,当前扩展结点 Z Z Z是解空间中的内部结点,对当前扩展结点 Z Z Z的每个儿子结点,计算其相应的符号三角形中“ + + +”个数与“ − - ”个数,并以深度优先的方式递归地对可行子树进行搜索,或剪去不可行子树
  • 对于给定的 n n n,当 n ( n + 1 ) / 2 n (n + 1) / 2 n(n+1)/2为奇数时,显然不存在所包含的“ + + +”个数与“ − - ”个数相同的符号三角形,此时可以通过简单的判断加以处理

时间复杂性

  • 更新符号三角形矩阵需要 O ( n ) O(n) O(n)时间,在最坏情况下,有 O ( 2 n ) O(2^{n}) O(2n)个结点需要更新符号三角形矩阵
  • 所以解符号三角形问题的回溯算法所需的计算时间为 O ( n 2 n ) O(n 2^{n}) O(n2n)

Python实现

def symbol_triangle(n):if (n * (n + 1) // 2) % 2:return 0half = n * (n + 1) // 4count = 0  # 记录符合条件的符号三角形数量# 初始化符号三角形矩阵path = [[''] * n for _ in range(n)]def backtrack(row, col, path, plus_count, minus_count):nonlocal count# 边界条件: 当列数等于 n 时, 表示已经生成了符号三角形的一种排列if col == n:if plus_count == minus_count:count += 1print(path)return# 尝试当前位置为 +path[row][col] = '+'plus_count += 1# 更新符号三角形矩阵cur_col = colfor i in range(1, cur_col + 1):if path[i - 1][cur_col - 1] == path[i - 1][cur_col]:path[i][cur_col - 1] = '+'plus_count += 1else:path[i][cur_col - 1] = '-'minus_count += 1cur_col -= 1# 检查是否满足条件, 继续生成下一行的符号if plus_count <= half and minus_count <= half:backtrack(row, col + 1, path, plus_count, minus_count)# 恢复回溯之前状态cur_col = colfor i in range(cur_col + 1):if path[i][cur_col] == '+':path[i][cur_col] = ''plus_count -= 1else:path[i][cur_col] = ''minus_count -= 1cur_col -= 1# 尝试当前位置为 -path[row][col] = '-'minus_count += 1# 更新符号三角形矩阵cur_col = colfor i in range(1, cur_col + 1):if path[i - 1][cur_col - 1] == path[i - 1][cur_col]:path[i][cur_col - 1] = '+'plus_count += 1else:path[i][cur_col - 1] = '-'minus_count += 1cur_col -= 1# 检查是否满足条件, 继续生成下一行的符号if plus_count <= half and minus_count <= half:backtrack(row, col + 1, path, plus_count, minus_count)backtrack(0, 0, path, 0, 0)return countn = 4print('满足条件的符号三角形如下:')count = symbol_triangle(n)print(f'符号三角形数量: {count}')
满足条件的符号三角形如下:
[['+', '+', '-', '+'], ['+', '-', '-', ''], ['-', '+', '', ''], ['-', '', '', '']]
[['+', '+', '-', '-'], ['+', '-', '+', ''], ['-', '-', '', ''], ['+', '', '', '']]
[['+', '-', '+', '+'], ['-', '-', '+', ''], ['+', '-', '', ''], ['-', '', '', '']]
[['+', '-', '+', '-'], ['-', '-', '-', ''], ['+', '+', '', ''], ['+', '', '', '']]
[['-', '+', '-', '+'], ['-', '-', '-', ''], ['+', '+', '', ''], ['+', '', '', '']]
[['-', '-', '+', '+'], ['+', '-', '+', ''], ['-', '-', '', ''], ['+', '', '', '']]
符号三角形数量: 6

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

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

相关文章

QT编译并部署QtMqtt相关环境+跑测demo【超详细教程】

文章目录 概要整体架构流程▷下载指定版本的QMqtt源码&#xff1a;▷编译后同步MQTT相关文件&#xff1a; 技术名词解释技术实现步骤详解一、编译源码1、编译报错2、解决思路3、编译通过 二、继续完善mqtt应用环境1、打开编译生成的shadow build文件夹2、同步lib3、同步bin4、同…

【Git-IDEA】在 IDEA 中使用 Git(clone、pull、push、merge、建立本地分支与远程分支的连接)

【Git-IDEA】在 IDEA 中使用 Git&#xff08;clone、pull、push、merge、建立本地分支与远程分支的连接&#xff09; 1&#xff09;Gitee2&#xff09;配置 Git3&#xff09;初始化本地仓库4&#xff09;连接远程仓库5&#xff09;clone5.1.方式一5.2.方式二 6&#xff09;分支…

react常用Hooks

Hooks是可从函数组件“挂钩”到React状态和生命周期功能的函数。 Hooks在class中是无效的——可在没有class的情况下使用React。&#xff08;不推荐重写已有组件&#xff0c;但是如果愿意&#xff0c;可以在一些新的组件中使用 Hooks。&#xff09;React提供一些内置的 Hooks&a…

5G NR无线蜂窝系统的信道估计器设计

文章目录 DMRS简介DMRS类型DMRS频域密度 信道估计实验仿真实验参数实验实验结论 DMRS简介 DMRS类型 类型A&#xff1a;DMRS位于时隙的第二个或第三个OFDM符号&#xff0c;由14个OFDM符号组成&#xff0c;当数据占据大部分时隙时使用A型映射。 类型B&#xff1a;用在URLLC中&a…

鸿蒙系列--组件介绍之其他基础组件(上)

上回介绍了基础组件中最常用的组件常用的基础组件&#xff0c;接下来还有其他基础组件 一、Blank 描述&#xff1a;空白填充组件 功能&#xff1a;在容器主轴方向上&#xff0c;具有自动填充容器空余部分的能力。只有当父组件为Row/Column时生效 子组件&#xff1a;无 Blan…

Spring之提前编译:AOT

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

【Java进阶篇】深拷贝和浅拷贝的理解(保姆级文献)

✔️深拷贝和浅拷贝的理解 在计算机内存中&#xff0c;每个对象都有一个地址&#xff0c;这个地址指向对象在内存中存储的位置。当我们使用变量引用一个对象时&#xff0c;实际上是将该对象的地址赋值给变量。因此&#xff0c;如果我们将一个对象复制到另一个变量中&#xff0c…

一台服务器​最大并发 tcp 连接数多少?65535?

首先&#xff0c;问题中描述的65535个连接指的是客户端连接数的限制。 在tcp应用中&#xff0c;server事先在某个固定端口监听&#xff0c;client主动发起连接&#xff0c;经过三次握手后建立tcp连接。那么对单机&#xff0c;其最大并发tcp连接数是多少呢&#xff1f; 如何标…

机械革命极光Pro重装Win10系统图解

机械革命极光Pro是性能优秀的笔记本电脑&#xff0c;深受广大用户的喜欢&#xff0c;现在用户想给笔记本电脑重新安装一下操作系统&#xff0c;但不知道重装系统的详细步骤。下面小编将带来机械革命极光Pro笔记本电脑重装系统Win10版本的步骤介绍&#xff0c;帮助更多的用户完成…

Elasticsearch:无需搜索 “Christmas” 即可找到有关圣诞节的书籍

随着假期的临近&#xff0c;我期待着变得舒适&#xff0c;拿起一本新书&#xff0c;享受轻松的时光。 但是使用搜索栏在线发现图书并不像看起来那么容易......大多数零售搜索引擎仅依赖于关键字搜索&#xff0c;当我们确切地知道我们正在寻找什么书名时&#xff0c;这很好&…

分布式事务是什么

分布式事务是企业集成中的一个技术难点&#xff0c;也是每一个分布式系统架构中都会涉及到的一个东西&#xff0c;特别是在微服务架构中&#xff0c;几乎可以说是无法避免&#xff0c;本文就分布式事务来简单聊一下。 数据库事务 我们先从数据库事务说起。数据库事务可能大家…

【大数据存储与处理】开卷考试总复习笔记

实验部分 一、 HBase 的基本操作 1. HBase Shell入门 # 进入HBase Shell环境 hbase shell2. HBase创建数据库表 # 创建表命令 create user, info1, info2 # 查看所有表 list # 查看表结构 describe user3. HBase数据操作 数据插入 put user, 0001, info1:name, jack put us…

傻瓜式教学Docker 使用docker compose部署 php nginx mysql

首先你可以准备这个三个服务,也可以在docker compose 文件中 直接拉去指定镜像,这里演示的是镜像服务已经在本地安装好了,提供如下: PHP # 设置基础镜像 FROM php:8.2-fpm# install dependencies RUN apt-get update && apt-get install -y \vim \libzip-dev \libpng…

智慧医疗平台开发:在线问诊系统源码搭建详解

如今&#xff0c;在线问诊系统的出现为患者提供了更为灵活、便捷的医疗服务。我们在开发系统之前&#xff0c;应该先简单了解系统的功能以及相关的技术。 一、核心功能需求 -用户注册和登录&#xff1a;用户可以通过注册账户&#xff0c;或者使用第三方登录方式进入系统。 …

高速风筒4套硬件案子谁会成为王者----【其利天下技术】

关于高速风筒的硬件电路&#xff0c;从MCU的角度来说&#xff0c;严格意义上是可以区分为四种硬件电路的&#xff0c;当前市场上这四种硬件电路也是并行存在的。所以有朋友电话问我&#xff0c;我怎么看待这四种硬件方案的优劣势和未来的&#xff1f;今天特意根据个人视角&…

基层医疗卫生信息可视化:Flask、MySQL、Echarts的综合利用

基层医疗卫生信息可视化&#xff1a;Flask、MySQL、Echarts的综合利用 正文&#xff1a; 社区卫生健康数据可视化是提升医疗服务水平和促进健康管理的有效手段。本文将介绍一种基于Flask、MySQL和Echarts技术的社区卫生健康数据可视化系统&#xff0c;数据源来自市基层医疗卫生…

Apache RocketMQ,构建云原生统一消息引擎

本文整理于 2023 年云栖大会林清山带来的主题演讲《Apache RocketMQ 云原生统一消息引擎》 演讲嘉宾&#xff1a; 林清山&#xff08;花名&#xff1a;隆基&#xff09;&#xff0c;Apache RocketMQ 联合创始人&#xff0c;阿里云资深技术专家&#xff0c;阿里云消息产品线负…

智能优化算法应用:基于孔雀算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于孔雀算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于孔雀算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.孔雀算法4.实验参数设定5.算法结果6.参考文献7.MA…

Crowd Counting近期研究(附代码资源)

1.Semi-Supervised Crowd Counting with Contextual Modeling: Facilitating Holistic Understanding of Crowd Scenes paper:https://arxiv.org/abs/2310.10352 code:https://github.com/cha15yq/MRC-Crowd 摘要&#xff1a; 为了减轻训练可靠的人群计数模型所需的繁重标注…

二分查找——OJ题(二)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、点名1、题目讲解2、算法原理3、代码实现 二、搜索旋转排序数组中的最⼩值1、题目讲解2、算…