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

【一个月备战蓝桥算法】递归与递推

字典序

在刷题和计算机科学领域,字典序(Lexicographical order)也称为词典序、字典顺序、字母序,是一种对序列元素进行排序的方式,它模仿了字典中单词的排序规则。下面从不同的数据类型来详细解释字典序:

字符串的字典序

在字典中,单词是按照字母的先后顺序排列的。对于两个字符串,字典序的比较规则如下:

  • 比较过程:从两个字符串的第一个字符开始逐个比较,如果对应位置的字符不同,则字符 ASCII 码值小的字符串排在前面;如果对应位置字符相同,则继续比较下一个位置的字符,直到出现不同字符或者其中一个字符串结束。

  • 示例

    • 比较 "apple" 和 "banana",因为第一个字符 'a' 的 ASCII 码值小于 'b',所以 "apple" 在字典序中排在 "banana" 前面。

    • 比较 "apple" 和 "app",前三个字符都相同,但 "app" 先结束,所以 "app" 在字典序中排在 "apple" 前面。

整数序列的字典序

对于整数序列,同样可以按照字典序进行比较:

  • 比较过程:将整数序列看作由数字组成的字符串,从序列的第一个元素开始逐个比较元素的大小,如果对应位置的元素不同,则元素值小的序列排在前面;如果对应位置元素相同,则继续比较下一个位置的元素,直到出现不同元素或者其中一个序列结束。

  • 示例

    • 比较序列 [1, 2, 3][2, 1, 3],第一个元素 1 小于 2,所以 [1, 2, 3] 在字典序中排在 [2, 1, 3] 前面。

    • 比较序列 [1, 2, 3][1, 2],前两个元素都相同,但 [1, 2] 先结束,所以 [1, 2] 在字典序中排在 [1, 2, 3] 前面。

在刷题中的应用

在很多算法题中,字典序常常作为排序的依据或者要求输出的结果满足字典序的要求,例如:

  • 全排列问题:要求输出给定序列的所有全排列,并且按照字典序输出。例如,对于序列 [1, 2, 3],其全排列按照字典序输出为 [1, 2, 3][1, 3, 2][2, 1, 3][2, 3, 1][3, 1, 2][3, 2, 1]

  • 子集问题:可能要求输出所有子集,并且按照字典序排列。

代码示例(C++ 实现全排列并按字典序输出)

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> nums = {1, 2, 3};do {for (int num : nums) {std::cout << num << " ";}std::cout << std::endl;} while (std::next_permutation(nums.begin(), nums.end()));return 0;
}

这些代码示例展示了如何生成全排列并按字典序输出,在刷题中可以根据具体需求对代码进行调整。

92.递归实现指数型枚举

 #include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 16; // 最大数据范围int statu[N]; // 状态数组 0表示未考虑 1表示选 2表示不选int n; // 标准输入void dfs(int u) // d{if(u > n) // 考虑到了最后一个位置 -- 递归出口{// 打印所有的数for(int i = 0; i <= n; i++){if(statu[i] == 1)printf("%d ", i);}printf("\n");// 打印换行,表示这一次枚举完毕return;// 返回上一层}// 不选的情况statu[u] = 2;dfs(u+1);statu[u] = 0;// 恢复现场// 选的情况statu[u] = 1;dfs(u+1);statu[u] = 0; }int main(){cin >> n;dfs(1); //对第1个数进行考虑return 0;}
 94.递归实现排列型枚举

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;// 数组定义成全局变量,初始值一定是0,如果定义成局部变量,初始值随机
const int N = 10;
int status[N]; // 0表示未填入 1—n表示填入的数
bool used[N];// 标记这个数有没有被用过 true用过 false没有用过
int n;void dfs(int u)
{// 递归出口if(u > n){for(int i = 1; i <= n; i++) printf("%d ", status[i]);puts("");return;}// 依此枚举每个分支,即当前位置可以填哪些数for(int i = 1; i <= n; i++){if(!used[i]) // 当前的数没有用{status[u] = i; // 填入这个数used[i] = true; // 标记已使用dfs(u + 1);// 恢复现场used[i] = false;status[u] = 0;}}}int main()
{scanf("%d", &n);dfs(1);return 0;
}
 93.递归实现组合型枚举

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;
int n, m;
const int N = 30;
int status[N];void dfs(int u, int start)
{// (u-1 + n - start + 1 < m)if(u + n - start < m) return; // 剪枝 -- start后面的数加起来都不够凑m个数// 递归出口if(u > m){for(int i = 1; i <= m; i++) printf("%d ", status[i]);puts("");return;}for(int i = start; i <= n; i++){status[u] = i;dfs(u+1, i+1);// 恢复现场status[u] = 0;}
}int main()
{scanf("%d %d", &n, &m);dfs(1, 1);return 0;
}
 1209.带分数

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;
const int N = 10;
int ans = 0;int n;
bool status[N]; // 判重数组
bool backup[N];bool check(int a, int c)
{long long b = n * (long long)c - a * c;// a b c 不能为0if(!a || !b || !c) return false;memcpy(backup, status, sizeof(status));while(b){int x = b % 10;b = b / 10;// x在ac中不能出现, x不能为0if(!x || backup[x]) return false;backup[x] = true; }// 看看每个数字是否出现过 -- 必须全部出现for(int i = 1; i <= 9; i++){if(!backup[i]) return false;}return true;
}void dfs_c(int u, int a, int c)
{if(u == n) return;if(check(a, c)) ans++;for(int i = 1; i <= 9; i++){if(!status[i]){status[i] = true;dfs_c(u+1, a, c * 10 +i);status[i] = false;}}}void dfs_a(int u, int a)
{if(a >= n) return; if(a) dfs_c(u, a, 0); // 只要a小于n,每种情况下都有dfs_cfor(int i = 1; i <= 9; i++){if(!status[i]){status[i] = true;dfs_a(u+1, a * 10 + i);status[i] = false; }}
}int main()
{cin >> n;dfs_a(0, 0);  // 当前已经用了多少个数字,  最开始a是0 cout << ans << endl;return 0;
}
 717.简单斐波那契

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;int main()
{int n = 0;cin >> n;int F[47];F[0] = 0, F[1] = 1, F[2] = 1;for(int i = 3; i <= n; i++){F[i] = F[i-1] + F[i-2];}for(int i = 0; i < n; i++){cout << F[i] << " ";}return 0;
}

 优化

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;int main()
{int n; cin >> n;int a = 0, b = 1;for(int i = 1; i <= n; i++){cout << a << ' ';int fn = a + b;a = b; b = fn;}return 0;
}
1208.翻硬币

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>using namespace std;const int N = 110;
char start[N], aim[N];void turn(int i)
{if(start[i] == '*') start[i] = 'o';else start[i] = '*';
}int main()
{cin >> start >> aim;int n = strlen(start);// 计算输入长度int ret = 0;for(int i = 0; i < n - 1; i++){if(start[i] != aim[i]){turn(i), turn(i+1);ret++;}}cout << ret << endl;return 0;
}
 116.飞行员兄弟

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>using namespace std;
const int N = 5;
char g[N][N], backup[N][N];
typedef pair<int, int> PII;// 映射函数
int get(int i, int j)
{return i * 4 + j;
}void turn_one(int x, int y)
{if(g[x][y] == '-') g[x][y] = '+';else g[x][y] = '-';
}void turn_all(int x, int y)
{for(int i = 0; i < 4; i++){turn_one(x, i);turn_one(i, y);}turn_one(x, y); // xy在循环中被按了两次,现在调回去
}int main()
{vector<PII> res;// 输入for(int i = 0; i < 4; i++)for(int j = 0; j < 4; j++)cin >> g[i][j];// 枚举所有方案for(int op = 0; op < (1 << 16); op++){vector<PII> temp; // 存储方案memcpy(backup, g, sizeof(g)); // 备份方案// 枚举16个位置for(int i = 0; i < 4; i++)for(int j = 0; j < 4; j++){if(op >> get(i, j) &1) // 判断是不是要按开关{temp.push_back({i, j});turn_all(i, j);}}bool hash_close = false;// 判断是否全部灯泡已经亮了for(int i = 0; i < 4; i++)for(int j = 0; j < 4; j++)if(g[i][j] == '+')hash_close = true;if(!hash_close){if(res.empty() || res.size() > temp.size() ) res = temp;}memcpy(g, backup, sizeof(backup)); // 恢复方案}cout << res.size() << endl;for (auto op : res) cout << op.first + 1 << ' ' << op.second + 1 << endl;return 0;
}

相关文章:

【一个月备战蓝桥算法】递归与递推

字典序 在刷题和计算机科学领域&#xff0c;字典序&#xff08;Lexicographical order&#xff09;也称为词典序、字典顺序、字母序&#xff0c;是一种对序列元素进行排序的方式&#xff0c;它模仿了字典中单词的排序规则。下面从不同的数据类型来详细解释字典序&#xff1a; …...

算法策略深度解析与实战应用

一、算法策略的本质与价值 算法策略是计算机科学的灵魂&#xff0c;它决定了问题解决的效率与质量。优秀的算法设计者就像战场上的指挥官&#xff0c;需要根据地形&#xff08;问题特征&#xff09;选择最佳战术&#xff08;算法策略&#xff09;。本文将深入剖析五大核心算法…...

【LeetCode 热题 100】3. 无重复字符的最长子串 | python 【中等】

美美超过管解 题目&#xff1a; 3. 无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。 注…...

计算机网络(1) 网络通信基础,协议介绍,通信框架

网络结构模式 C/S-----客户端和服务器 B/S -----浏览器服务器 MAC地址 每一个网卡都拥有独一无二的48位串行号&#xff0c;也即MAC地址&#xff0c;也叫做物理地址、硬件地址或者是局域网地址 MAC地址表示为12个16进制数 如00-16-EA-AE-3C-40 &#xff08;每一个数可以用四个…...

在 Docker 中,无法直接将外部多个端口映射到容器内部的同一个端口

Docker 的端口映射是一对一的&#xff0c;即一个外部端口只能映射到容器内部的一个端口。 1. 为什么不能多对一映射&#xff1f; 端口冲突&#xff1a; 如果外部多个端口映射到容器内部的同一个端口&#xff0c;Docker 无法区分外部请求应该转发到哪个内部端口&#xff0c;会…...

计算机网络开发(2)TCP\UDP区别、TCP通信框架、服务端客户端通信实例

TCP与UDP区别 UDP&#xff1a;用户数据报协议&#xff0c;面向无连接&#xff0c;可以单播&#xff0c;多播&#xff0c;广播&#xff0c; 面向数据报&#xff0c;不可靠TCP&#xff1a;传输控制协议&#xff0c;面向连接的&#xff0c;可靠的&#xff0c;基于字节流&#xff…...

ubuntu打包 qt 程序,不用每次都用linuxdeployqt打包

用linuxdeployqt打包太麻烦&#xff0c;每次程序编译都要用linuxdeployqt打包一次&#xff0c;而且每次都要很长时间&#xff0c;通过研究得出一个新的打包方法 1.用用linuxdeployqt得出依赖的库文件&#xff08;只要没有增加新模块&#xff0c;只要用一次就可以&#xff09; …...

【Python项目】基于深度学习的车辆特征分析系统

【Python项目】基于深度学习的车辆特征分析系统 技术简介&#xff1a;采用Python技术、MySQL数据库、卷积神经网络&#xff08;CNN&#xff09;等实现。 系统简介&#xff1a;该系统基于深度学习技术&#xff0c;特别是卷积神经网络&#xff08;CNN&#xff09;&#xff0c;用…...

C++(初阶)(二)——类和对象

类和对象 类和对象类的定义格式访问限定符类域 实例化实例化概念内存对齐 this指针 类的定义 类&#xff08;Class&#xff09;是一种用于创建对象的蓝图或模板。它定义了对象&#xff08;变量&#xff09;的属性&#xff08;数据&#xff09;和方法&#xff08;行为&#xff…...

JS—组成:2分钟掌握什么是ECMAScript操作,什么是DOM操作,什么是BOM操作

个人博客&#xff1a;haichenyi.com。感谢关注 1. 目录 1–目录2–组成3–内置对象 2. 组成 一直都在说JS&#xff0c;JS&#xff0c;到底啥是JS有了解过吗&#xff1f;JS由哪几部分组成的呢&#xff1f; 定义&#xff1a; JavaScript是一种轻量级、解释型或即时编译型的编程语…...

ArcGIS操作:10 投影坐标系转地理坐标系

应用情景&#xff1a;在计算shp面质心坐标的时&#xff0c;由于需要的坐标是经纬度&#xff0c;所以需要将投影坐标系转化为地理坐标系 1、打开工具箱 2、右侧&#xff1a;数据管理工具 → 投影和变换 → 要素 → 投影 3、选择投影的数据、输出路径、地理坐标系&#xff0c;点…...

NVIDIA Jetson Nano的国产替代,基于算能BM1684X+FPGA+AI算力盒子,支持deepseek边缘部署

NVIDIA Jetson Nano的国产替代&#xff0c;基于算能BM1684X的AI算力盒子&#xff0c;支持deepseek边缘部署 另外&#xff0c;还提供BM1684XFPGAAI的解决方案。 核心板基于Sophon SG2300X SoC&#xff08;也叫BM1684X&#xff09;打造 带有8核ARM Cortex-A53 2.3GHz&#xff0c…...

c++全排列

题目描述 按照字典序输出自然数 1 到 n 所有不重复的排列&#xff0c;即 n 的全排列&#xff0c;要求所产生的任一数字序列中不允许出现重复的数字。 输入格式 一个整数 n。 输出格式 由 1∼n 组成的所有不重复的数字序列&#xff0c;每行一个序列。 每个数字保留 5 个场…...

VSCode 配置优化指南:打造极致高效的前端开发环境

VSCode 配置优化指南&#xff1a;打造极致高效的前端开发环境 一、基础环境配置&#xff1a;让开发更流畅 1. 性能优化设置 // settings.json {"files.autoSave": "afterDelay", // 自动保存&#xff08;延迟1秒&#xff09;"files.exclud…...

利用 ArcGIS Pro 快速统计省域各市道路长度的实操指南

在地理信息分析与处理的工作中&#xff0c;ArcGIS Pro 是一款功能强大的 GIS 软件&#xff0c;它能够帮助我们高效地完成各种复杂的空间数据分析任务。 现在&#xff0c;就让我们一起深入学习如何借助 ArcGIS Pro 来统计省下面各市的道路长度&#xff0c;这一技能在城市规划、…...

CTF 中的 XSS 攻击:原理、技巧与实战案例

跨站脚本攻击&#xff08;Cross-Site Scripting&#xff0c;简称 XSS&#xff09;是一种常见的 Web 漏洞&#xff0c;利用该漏洞&#xff0c;攻击者可以在受害者浏览器中注入并执行恶意脚本。在 CTF&#xff08;Capture The Flag&#xff09;竞赛中&#xff0c;XSS 攻击不仅是一…...

LeetCode hot 100—二叉树的最大深度

题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;root [1,n…...

.h264/.h265文件 前端直接播放

由于接收摄像头 告警视频&#xff0c;需要前端直接播放&#xff0c;不想后端转码后传输。 摄像头 判断到告警后往服务器上报 .h264 /.h265 视频文件。 解决方式&#xff1a;html5直接采用 ffmpeg 进行转码 &#xff0c;然后塞入 video标签&#xff0c;进行播放 目前改动ffmp…...

【单片机通信技术】串口通信的几种方式与比较,详细解释SPI通信

一、介绍 串口通信是一种通过串行接口逐位传输数据的通信方式&#xff0c;广泛应用于嵌入式系统、工业控制、传感器网络等领域。 二、以下是几种常见的串口通信方式及其对比&#xff1a; 1.UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09; 特点&am…...

PDF转JPG(并去除多余的白边)

首先&#xff0c;手动下载一个软件&#xff08;poppler for Windows&#xff09;&#xff0c;下载地址&#xff1a;https://github.com/oschwartz10612/poppler-windows/releases/tag/v24.08.0-0 否则会出现以下错误&#xff1a; PDFInfoNotInstalledError: Unable to get pag…...

题目 3217 ⭐成绩统计⭐【滑动窗口 + 二分搜索】蓝桥杯2024年第十五届省赛

小蓝的班上有 n n n 个人&#xff0c;一次考试之后小蓝想统计同学们的成绩&#xff0c;第 i 名同学的成绩为 a i a_i ai​ 。当小蓝统计完前 x x x 名同学的成绩后&#xff0c;他可以从 1 ∼ x 1 ∼ x 1∼x 中选出任意 k k k 名同学的成绩&#xff0c;计算出这 k k k 个成…...

URL中的特殊字符与web安全

在现代Web应用中&#xff0c;URL作为客户端与服务器之间的通信桥梁&#xff0c;承载着大量的重要信息。URL中的特殊字符&#xff0c;看似只是一些常见的符号&#xff0c;但在Web安全领域&#xff0c;它们与其他安全知识密切相关&#xff0c;如在Base64编码、SQL注入&#xff0c…...

八卡5090服务器首发亮相!

AI 人工智能领域热度居高不下。OpenAI 的 GPT - 4 凭强悍语言处理能力&#xff0c;在内容创作、智能客服等领域广泛应用。清华大学团队的 DeepSeek 大模型在深度学习训练优势突出&#xff0c;正促使各行业应用端算力需求向推理主导转变&#xff0c;呈爆发式增长 。 随着 DeepS…...

esp32驱动带字库芯片TFT屏幕

前言 学习esp32单片机开发&#xff0c;前段时间在网上买了一块2.0寸TFT屏幕。 长这个样子&#xff0c;这个屏幕带汉字字库的硬件模块。我仔细看了一下这个字库模块上面写的字是25Q32FVSIG 1336 文档 卖家也发来了开发文档&#xff0c;是个doc文档&#xff0c;张这个样子。 开…...

为AI聊天工具添加一个知识系统 之138 设计重审 之2 文章学 引言之2 附加符号学附属诠释学附随工程学(联系)

本文要点 要点 符号学大局观&#xff1a; 诠释学&#xff08;当代 加成[0]&#xff1a;“预期”和“预设” 两者的 不期而遇 。“邂逅”&#xff09; 我们在文章学工具设计中 以全局观考虑&#xff1a;嵌入编程工具的逻辑性底&#xff08; 哲学诠释 下确界&#xff09; 并…...

java环境部署

java环境部署 一、准备工作 jrejdkeclipse jdk下载&#xff1a;21和1.8-----官网&#xff1a;Oracle&#xff1a;Java 下载 |神谕 该处选择要依据自身的系统类型选择下载 idea的下载安装&#xff1a;IntelliJ IDEA | Other Versions 二、安装 三、环境配置 四、使用 五、i…...

正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-2.1 uboot简介

前言&#xff1a; 本文是根据哔哩哔哩网站上“Arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。 引用&#xff1a; …...

CentOS 7.9 安装 ClickHouse 文档

1. 环境准备 确保系统为 CentOS 7.9&#xff0c;并已安装 Docker。如果未安装 Docker&#xff0c;请先安装 Docker。 安装 Docker # 卸载旧版本 Docker&#xff08;如果有&#xff09; sudo yum remove -y docker docker-client docker-client-latest docker-common docker-…...

高考數學。。。

2024上 具体来说&#xff0c;直线的参数方程可以写为&#xff1a; x1t y−t z1t 二、简答题(本大题共5小题&#xff0c;每小题7分&#xff0c;共35分。) 12.数学学习评价不仅要关注结果评价&#xff0c;也要关注过程评价。简要说明过程评价应关注哪几个方面。…...

使用GitLink个人建站服务部署Allure在线测试报告

更多技术文章&#xff0c;访问软件测试社区 文章目录 &#x1f680;前言&#x1f511;开通GitLink个人建站服务1. 前提条件2. 登录GitLink平台&#xff08;https://www.gitlink.org.cn/login&#xff09;3. 进入设置>个人建站>我的站点4. 新建站点5. 去仓部进行部署6. 安…...