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

news2025/3/6 7:19:43
字典序

在刷题和计算机科学领域,字典序(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 不能为0
    if(!a || !b || !c) return false;
    
    memcpy(backup, status, sizeof(status));
    while(b)
    {
        int x = b % 10;
        b = b / 10;
        
        // x在ac中不能出现, x不能为0
        if(!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_c
    
    for(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;
}

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

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

相关文章

ArcGIS操作:07 绘制矢量shp面

1、点击目录 2、右侧显示目录 3、选择要存储的文件夹&#xff0c;新建shp 4、定义名称、要素类型、坐标系 5、点击开始编辑 6、点击创建要素 7、右侧选择图层、创建面 8、开始绘制&#xff0c;双击任意位置结束绘制

Axure原型模板与元件库APP交互设计素材(附资料)

为了高效地进行APP和小程序的设计与开发&#xff0c;原型设计工具Axure凭借其强大的功能和灵活性&#xff0c;成为了众多产品经理和设计师的首选。本文将详细介绍Axure原型模板APP常用界面组件元件库、交互设计素材&#xff0c;以及多套涵盖电商、社区服务、娱乐休闲、农业农村…

<网络> TCP协议

目录 TCP协议 与系统相关联 文件与套接字的关系 C语言的多态 谈谈可靠性 TCP协议格式 目的端口号 4位首部长度 16位窗口大小 序号与确认序号 32位序号 32位确认序号 标志位 TCP连接 三次握手 四次挥手 三次握手状态变化 四次挥手状态变化 流量控制 滑动窗口 拥塞控制 延迟应…

JAVA编程【jvm垃圾回收的差异】

jvm垃圾回收的差异 JVM&#xff08;Java Virtual Machine&#xff09;的垃圾回收&#xff08;GC&#xff09;机制是自动管理内存的一种方式&#xff0c;能够帮助开发者释放不再使用的内存&#xff0c;避免内存泄漏和溢出等问题。不同的垃圾回收器&#xff08;GC&#xff09;有…

VBA信息获取与处理第五节:如何在单个工作表中查找某个给定值

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。这部教程给大家讲解的内容有&#xff1a;跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…

ubuntu20.04 安装离线版docker-20.10.0

1. 安装步骤 步骤一&#xff1a;官网下载 docker 安装包 wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.0.tgz步骤二&#xff1a;解压安装包; tar -zxvf docker-20.10.0.tgz 步骤三&#xff1a;将解压之后的docker文件移到 /usr/bin目录下; c…

【推荐算法】python游戏数据分析可视化推荐系统(完整系统源码+数据库+开发笔记+详细部署教程)✅

目录 一、项目背景 二、项目拟解决问题 &#xff08;1&#xff09;数据价值断层 &#xff08;2&#xff09;用户画像模糊 &#xff08;3&#xff09;推荐策略单一 &#xff08;4&#xff09;决策可视化缺失 三、研究目的 &#xff08;1&#xff09;轻量化服务架构验证 …

Vue 3 整合 WangEditor 富文本编辑器:从基础到高级实践

本文将详细介绍如何在 Vue 3 项目中集成 WangEditor 富文本编辑器&#xff0c;实现图文混排、自定义扩展等高阶功能。 一、为什么选择 WangEditor&#xff1f; 作为国内流行的开源富文本编辑器&#xff0c;WangEditor 具有以下优势&#xff1a; 轻量高效&#xff1a;压缩后仅…

基于Asp.net的农产品销售管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

android11使用gpio口控制led状态灯

目录 一、简介 二、解决方法 A、底层驱动 B、上层调用 C、验证 一、简介 1、需求&#xff1a;这里是用2个gpio口来控制LED灯&#xff0c;开机时默认亮蓝灯&#xff0c;按开机键&#xff0c;休眠亮红灯&#xff0c;唤醒亮蓝灯。 原理图&#xff1a; 这里由于主板上电阻R63…

ASP .NET Core 学习(.NET9)Serilog日志整合

Serilog 是一个功能强大的 .NET 日志库&#xff0c;以其简洁的配置和灵活的输出方式而受到开发者喜爱。支持多种日志输出目标&#xff08;如控制台、文件、数据库等&#xff09;&#xff0c;并且可以通过结构化日志的方式记录丰富的上下文信息&#xff0c;便于后续的日志分析和…

基于python+flask+mysql的川渝地区天气数据分析系统

系统首页 天气数据分析 历史天气数据查询 python爬虫代码展示 import requests import re import time as delay from bs4 import BeautifulSoup import pandas as pd import pymysql import json# 定义一个函数&#xff0c;用于获取网页的源代码 def get_page(url, headers)…

【Linux———信号精讲】

你是怎么做到的&#xff0c;给了她想要的爱............................................................................................ 文章目录 前言 一、【信号入门】 1.1、【生活角度的信号】 1.2、【ctrl c与z】 1.3、【信号的发送与记录】 1.4、【信号处理常见方式…

scBaseCamp:一个AI代理的可持续扩充的单细胞数据存储库

scBaseCamp是Tahoe-100M&#xff1a;最大规模的单细胞扰动数据集的后续 构建虚拟细胞是人工智能与生物学交叉领域的新兴前沿方向&#xff0c;单细胞RNA测序数据的快速增长为这一领域提供了助力。通过整合数百项研究中数百万个细胞的基因表达谱&#xff0c;单细胞图谱为训练由 …

GPTs+RPA赋能智慧校园:构建下一代教育智能体的技术实践

文章目录 一、核心应用场景与技术融合1. 教务流程自动化&#xff08;RPAGPTs双引擎驱动&#xff09;2. 智能问答中枢&#xff08;NLP流程自动化&#xff09; 二、关键技术实现方案1. 多模态数据处理架构2. 智能文档处理流水线 三、典型系统架构设计智慧校园AI中台架构&#xff…

【AIGC】通义万相 2.1 与蓝耘智算:共绘 AIGC 未来绚丽蓝图

一、引言 在人工智能技术迅猛发展的今天&#xff0c;AIGC&#xff08;生成式人工智能内容生成&#xff09;领域正以惊人的速度改变着我们的生活和工作方式。从艺术创作到影视制作&#xff0c;从广告设计到智能客服&#xff0c;AIGC 技术的应用越来越广泛。通义万相 2.1 作为一…

【AIGC实战】蓝耘元生代部署通义万相2.1文生图,结尾附上提示词合集

文章目录 &#x1f44f;什么是文生图&#xff1f;&#x1f44f;通义万相2.1文生图&#x1f44f;蓝耘元生代部署通义万相2.1&#x1f44f;平台注册&#x1f44f;部署通义万相2.1&#x1f44f;使用通义万相2.1文生图 &#x1f44f;提示词合集&#x1f44f;总结 随着人工智能生成内…

Gartner:数据安全平台DSP提升数据流转及使用安全

2025 年 1 月 7 日&#xff0c;Gartner 发布“China Context&#xff1a;Market Guide for Data Security Platforms”&#xff08;《数据安全平台市场指南——中国篇》&#xff0c;以下简称指南&#xff09;&#xff0c;报告主要聚焦中国数据安全平台&#xff08;Data Securit…

Excel的行高、列宽单位不统一?还是LaTeX靠谱

想要生成田字格、米字格、带拼音标准&#xff0c;方便小学生书法和练字。Word&#xff0c;Excel之类所见即所得是最容易相当的方式。但它们处理带田字格之类背景时&#xff0c;如果没有专用模板、奇奇怪怪的插件&#xff0c;使用起来会碰到各种问题。比如&#xff0c;Word里面用…

【JavaSE-5】程序逻辑控制相关练习题

1、判断一个数字是否是素数(质数) //方法1&#xff1a; import java.util.Scanner; public static void main(String[] args) {//判断一个数字是否是素数:除了1和它本身外没有其他数可以整除Scanner scan new Scanner(System.in);int num scan.nextInt();boolean flag tru…