当前位置: 首页 > news >正文

算法题(167):FBI树

审题:

本题需要我们将字符串按照题目要求进行递归展开,并按照后序遍历的顺序输出

思路:

方法一:递归

首先我们需要模拟一下题目的意思

其实就是第一步判断属于什么字符,然后将字符串分两半进行下一轮判断。而由于题目要求按后序遍历输出,所以我们就按照后续遍历的方式进行递归调用

疑问:我们如何判断字符串的情况?

如果我们直接遍历来判断会导致时间复杂度过高,所以我们可以采用数值判断法

假设字符串的每一个索引位置的值相加之和为0,说明字符串都为0,此时为字符'B'。

假设字符串的每一个索引位置的值相加之和等于字符串长度,说明字符串都为1,此时为字符'I'。

其他情况就为字符‘F’

递归功能:完成对应索引区间的字符串的后序遍历字符输出

解题:
 

#include<iostream>
using namespace std;
const int N = 15;
int f[1 << N];//前缀和数组
int n;
//dfs负责解决区间中所有字符串翻译与输出的问题
void dfs(int left, int right)
{//结束条件if (left > right){return;}//判断当前串的类型char answer;int sum = f[right] - f[left - 1];if (sum == 0) answer = 'B';else if (sum == right - left + 1) answer = 'I';//sum等于串长度else answer = 'F';//按照后序遍历的方式进行if (left == right)//还剩最后一个字符,若不截断会死递归{cout << answer;return;}int mid = (left + right) / 2;dfs(left, mid); dfs(mid + 1, right);cout << answer;
}
int main()
{cin >> n;n = (1 << n);for (int i = 1; i <= n; i++){char ch;cin >> ch;if (ch == '1') f[i] = f[i - 1] + 1;else f[i] = f[i - 1];}dfs(1, n);return 0;
}

1.我们使用前缀和算法快速的求出对应字符串的sum,前缀和数组存储的是每一个字符的前缀和的值

2.结束条件:left大于right或left等于right

其中大于的情况下:说明所有字符串都遍历完了,直接返回

等于的情况:如果不截断下来会出现死循环,因为mid会等于left。这种情况只剩当前的字符没有输出,我们直接输出当前字符并返回即可

P1087 [NOIP 2004 普及组] FBI 树 - 洛谷

相关文章:

  • 系统设计基本功:流量与存储需求估算
  • 力扣HOT100之堆:295. 数据流的中位数
  • Django项目QQ授权登录报错:redirect uri is illegal(100010) 解决方法
  • Android WebView 深色模式适配方案总结
  • P2842 纸币问题 1
  • java复习 08
  • 企业如何科学的选择WMS仓储管理系统
  • 【Python打卡Day33】简单神经网络@浙大疏锦行
  • 多模态大语言模型arxiv论文略读(116)
  • 知识图谱和图数据库Neo4j
  • ETLCloud中数据生成规则使用技巧
  • DDoS攻防实战:从应急脚本到AI云防护系统
  • 系统入侵排查实战指南:从Windows到Linux的应急响应与溯源分析​
  • 6.10【Q】网络安全期末复习
  • Mac电脑 SSH客户端 - Termius
  • 【电路物联网】SDN架构与工作原理介绍
  • leetcode 135. 分发糖果
  • 由编译osgEarth源码引发的一系列问题(三)利用vcpkg安装osg与OSGEarth
  • Spring Boot 完整教程 - 从入门到精通(全面版)
  • Seaborn入门到上头:让数据可视化变成享受的艺术(附防秃指南)
  • 做网站模板在哪儿找/小程序推广方案
  • 制作网站副本/怎么做市场推广
  • 佛山微网站开发哪家好/东莞网站推广营销网站设计
  • 淮安做网站的有多少钱/2345软件为什么没人管
  • 网站注册地/上海网络推广排名公司
  • 深圳正规网站建设公司/黄页网络的推广软件