[NOIP2004 普及组] FBI 树 递归解法

news2024/10/1 12:13:32

[NOIP2004 普及组] FBI 树

题目描述:

我们可以把由 0 和 1 组成的字符串分为三类:全 0 串称为 B 串,全 1 串称为 I 串,既含 0 又含 1 的串则称为 F 串。

FBI 树是一种二叉树,它的结点类型也包括 F 结点,B 结点和 I 结点三种。由一个长度为 $2^N$ 的 01 串 S 可以构造出一棵 FBI 树 T,递归的构造方法如下:

1. T 的根结点为 R,其类型与串 S 的类型相同;
2. 若串 S 的长度大于 1,将串 S 从中间分开,分为等长的左右子串 S1 和 S2;由左子串 S1 构造 R 的左子树 T1,由右子串 S2 构造 R 的右子树 T2。

现在给定一个长度为 2^N 的 01 串,请用上述构造方法构造出一棵 FBI 树,并输出它的后序遍历序列。

输入格式

第一行是一个整数 N(0≤N≤10),

第二行是一个长度为 2^N 的 01 串。

输出格式

一个字符串,即 FBI 树的后序遍历序列。

输入输出样例

输入 #1:

3
10001011

输出 #1:

IBFBBBFIBFIIIFF

说明/提示

对于 %40% 的数据,N≤2;

对于全部的数据,N≤10。

noip2004普及组第3题。

题目大意:

 题目大意就是给定一个序列,就比如10001011,我们将这个序列一直从中间分开,左边为左子树,右边为右子树,根据每一段全0全1还是10都有得到值F、B、I,构建成一棵二叉树,并且倒序输出。

队列做法:

  这个解法要相对复杂一点儿。

[NOIP2004 普及组] FBI 树 队列解法icon-default.png?t=N4P3http://t.csdn.cn/ZLgIn

递归做法:

对于上述的队列做法,我们还有一种更优的算法,就是直接递归求解。

我们为什么要先得到层次遍历数组之后再后序遍历呢?为什么题目中让我们直接输出后序遍历呢?

对于一个FBI树,如果要得到后序遍历,我们当然是先处理左节点之后处理右节点,最后处理根节点,这就是后序遍历 而刚好我们构建这颗FBI树的时候不也是递归先处理左子节点,再处理右子节点之后再处理自身吗

那么我们就有了一个思路:

对于一个范围,我们可以处理这个范围的左范围之后处理右范围,而每个范围都是一直进入左范围,到最后不就到了叶节点,处理完叶节点之后会退回上层处理右边的叶节点,再退回去处理他们的父结点,而这刚好就是后序遍历

所以我们可以写出下面的递归代码,只要当前范围不是叶节点,我们就继续进去处理左范围和右范围,一直到l==r的情况,这种情况也就是说我们只需要判断是1还是0输出即可,然后退回去处理右节点。在这之后,程序会退回到父结点,然后继续判断这个范围是F、B还是I

#include<bits/stdc++.h>
using namespace std;
int n;
char t[1050];
void FBI(int l,int r){
    if(l<r){
        FBI(l,(l+r)/2);
        FBI((l+r)/2+1,r);
    }
    bool f1=1,f2=1;
    for(int i=l;i<=r;i++){
        if(t[i]=='1') 
		  f1 = 0;
        else if(t[i]=='0') 
		  f2=0;
    }
    if(!f1&&!f2)
      printf("F");
    else if(f2&&!f1)
      printf("I");
    else if(f1&&!f2)
      printf("B");
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=pow(2,n);i++)
      cin>>t[i];
    FBI(1,pow(2,n));
    return 0;
}

总结:

   基于我们之前较为复杂的队列解法,我们深入思考后就可以得到较为简单的递归解法。

题目链接:

[NOIP2004 普及组] FBI 树 - 洛谷https://www.luogu.com.cn/problem/P1087

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

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

相关文章

SpringMVC 学习笔记

SpringMVC 学习笔记 1、回顾MVC1.1、什么是MVC1.2、Model1时代1.3、Model2时代1.4、回顾Servlet 2、什么是SpringMVC2.1、概述2.2、中心控制器2.3、SpringMVC执行原理 【重要】 3、HelloSpring3.1、配置版3.2、注解版3.3、小结 4、Controller 及 RestFul4.1、Controller 控制器…

2.算法与数据结构

算法与数据结构 文章目录 算法与数据结构一、算法相关1、十大排序算法总结冒泡排序插入排序选择排序快速排序基数排序桶排序希尔排序归并排序堆排序 2、经典算法介绍递归算法回溯算法贪心算法深度优先遍历广度优先遍历动态规划算法 3、常见算法1、迪杰斯特拉(Dijkstra)算法介绍…

C++中的函数组合:用std::function实现编程艺术

C中的函数组合&#xff1a;用std::function实现编程艺术 1. 引言1.1 C中的函数式编程 (Functional Programming in C)1.2 函数组合的概念和价值 (Concept and Value of Function Composition)1.3 std::function概述 (Overview of std::function) 2. 如何在C中实现函数组合 (Imp…

【网络协议详解】——万维网WWW系统协议(学习笔记)

目录 &#x1f552; 1. 概述&#x1f552; 2. 文本传输协议HTTP&#x1f552; 3. HTTP的报文格式&#x1f552; 4. Cookie&#x1f552; 5. 万维网缓冲与代理服务器 &#x1f552; 1. 概述 万维网www&#xff08;World Wide Web&#xff09;并非某种特殊的计算机网络。它是一个…

两个iframe同时滚动实现界面内容对比功能

背景&#xff1a;因为要实现一个版本对比功能&#xff0c;所以要保证两个界面能同时滚动。&#xff08;本文只讲同时滚动&#xff0c;对比功能文本只讲思路&#xff0c;具体代码实现如有需要 可以联系我&#xff09;&#xff0c;因为过程中有部分收获特此记录。 本文参考&…

Jetson硬件 升级jetpack系统 版本流程

前言&#xff1a; 准备一个linux系统电脑&#xff0c;一个跳线帽&#xff0c;以及一条usb线 以及英伟达开发者账号&#xff0c;点击https://developer.nvidia.com/zh-cn/embedded/jetpack进行注册 注意&#xff1a;烧录的目标硬件是以前装过低版本的jetpack&#xff0c;以下步…

工业自动化新引擎:工业机器人引领制造业转型升级

自2010年开始&#xff0c;我国15-64岁人口比例下滑&#xff0c;截至2022年我国总人数出现负增长&#xff0c;同比下滑0.1%&#xff0c;因人口老龄化加剧和出生率的持续走低&#xff0c;致使进入生产体系的劳动力越来越少。 随着我国经济进入新常态&#xff0c;制造业面临着产能…

通过训练NLP制作一个自己的简易输入法

最近开始研究NLP&#xff0c;然后根据手写CV UP主的视频&#xff0c;写了一个N Gram的NLP模型&#xff0c;算是该领域里的hello world吧。然后我又添加了几行代码实现了一个非常简易的输入法。 项目说明&#xff1a; 数据集可以自创&#xff0c;导入txt文件即可&#xff1b; …

K8s in Action 阅读笔记——【6】Volumes: attaching disk storage to containers

K8s in Action 阅读笔记——【6】Volumes: attaching disk storage to containers 在前三章中&#xff0c;我们介绍了Pods以及它们与ReplicationControllers、ReplicaSets、DaemonSets、Jobs和Services等Kubernetes资源的交互。现在&#xff0c;我们将回到Pod内部&#xff0c;…

【java 基础一】 纯语法基础记录

一、基础 1.1 变量 Java 变量是程序中存储数据的容器。 在 Java 中&#xff0c;变量需要先声明再使用&#xff0c;并且必须先声明再赋值。 声明变量&#xff1a;声明变量时需要指定变量的类型、名称和初始值。例如&#xff0c;声明一个整型变量可以如下所示&#xff1a; in…

水处理施工方案合集

编制说明及工程简介 (一) 编制说明 本施工组织设计是依据建设单位提供的招标文件、施工图、同类工程施工资料和国家有关施工规范及验收标准进行编制的。本施工组织设计针对本工程施工中的关键点、难点及其处理措施&#xff0c;主要施工方法&#xff0c;施工组织部署&#xff…

如何理解 CRM 客户关系管理系统?

如何理解 CRM 客户关系管理系统&#xff1f; CRM的作用不止是工具&#xff0c;根据用户和对象的不同&#xff0c;CRM创造的价值也是不同的。 打个比方: 有的企业是用CRM来管理客户信息;有的企业是用CRM来获取流量的&#xff1b;有的企业是用CRM来做销售管理的&#xff1b;还…

Springboot整合OSS并实现文件上传和下载

目录 一.OSS服务器开通并创建账户 二.Springboot整合OSS 1.创建springboot项目 2.整合OSS 三.postman测试 一.OSS服务器开通并创建账户 参考阿里云OSS的使用(全程请登陆)_zhz小白的博客-CSDN博客https://blog.csdn.net/zhouhengzhe/article/details/112077301 二.Springb…

深度学习笔记之循环神经网络(八)LSTM的轻量级变体——门控循环单元(GRU)

深度学习笔记之LSTM轻量级变体——门控循环单元[GRU] 引言回顾&#xff1a; LSTM \text{LSTM} LSTM的前馈计算过程 LSTM \text{LSTM} LSTM的问题 GRU \text{GRU} GRU的前馈计算过程 GRU \text{GRU} GRU的优势 引言 上一节介绍了从反向传播过程的角度认识 LSTM \text{LSTM} LST…

【29】核心易中期刊推荐——计算语言学人工智能(AI)技术

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…

使用javascript-obfuscator给js文件加密

一、安装javascript-obfuscator包 npm install javascript-obfuscator -g二、默认配置直接压缩文件 javascript-obfuscator miniprogram/src/utils/utils_create_sign.js --output miniprogram/src/utils/create_sign.js三、根据配置文件压缩文件 3.1、创建mixs.json配置文…

前端阿里云OSS直传,微信小程序版本

前言&#xff1a; 网络上许多的文章资料&#xff0c;全是使用阿里云官方的SDK&#xff0c;ali-oss插件去做直传。可是各位素未谋面的朋友要注意&#xff0c;这个SDK它支持web环境使用&#xff0c;也就是PC端浏览器。 当项目环境切换到微信小程序&#xff0c;是无法使用这种方…

Power BI Embedded自动缩放容量,为公司每个月节省上万元

哎&#xff0c;不知道今年行情怎么就这样了&#xff0c;大厂一边大批毕业生&#xff0c;一边大量招人。难道是今年的新人便宜&#xff1f;就连道哥&#xff08;吴翰清&#xff0c;阿里P10&#xff0c;中国顶级黑客&#xff09;都从阿里离职了&#xff0c;当年年少不懂学计算机&…

Nodejs批量处理图片小工具:批量修改图片信息

小工具一&#xff1a;批量修改文件夹里面的图片名称 步骤&#xff1a; 1.安装nodejs。 2.根据需要修改editFileName(filePath, formatName)函数的参数&#xff0c;也可以不改&#xff0c;直接将renameFile.js和img文件夹放在同一个目录下。 3.在renameFile.js目录下开启终端…

SQL报错this is incompatible with sql_mode=only_full_group_by

一、bug记录 1.1.bug截图 1.2.sql语句 SELECT id,batch_no,if_code,channel_mch_no,bill_date,bill_type,currency,order_id, channel_order_no,channel_amount,channel_fee_amount,channel_success_at, channel_user,channel_state,org_pay_order_id,channel_refund_amoun…