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

字典序

在刷题和计算机科学领域,字典序(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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSDN 1024天 创作纪念日

机缘 还记得那是2022年5月&#xff0c;在上家公司工作时候&#xff0c;意外发现同事在通过CSDN记录一些日常遇到、解决的问题&#xff0c;也会更新一些他擅长领域的知识点&#xff0c;并且收获了不少的粉丝和阅读量&#xff0c;这不由得激起了我的兴趣。也在有空时候&#xff…

用于管理 Elasticsearch Serverless 项目的 AI Agent

作者&#xff1a;来自 Elastic Fram Souza 由自然语言驱动的 AI 代理&#xff0c;可轻松管理 Elasticsearch Serverless 项目 - 支持项目创建、删除和状态检查。 这个小型命令行工具让你可以用简单的英语管理你的无服务器 Elasticsearch 项目。它通过AI&#xff08;这里是 Ope…

机器学习数学通关指南

✨ 写在前面 &#x1f4a1; 在代码的世界里沉浸了十余载&#xff0c;我一直自诩逻辑思维敏捷&#xff0c;编程能力不俗。然而&#xff0c;当我初次接触 DeepSeek-R1 并领略其清晰、系统的思考过程时&#xff0c;我不禁为之震撼。那一刻&#xff0c;我深刻意识到&#xff1a;在A…

< 自用文儿 > DELETED 设置速读 in Ubuntu24

systemctl 和 DELETED&#xff1a; 配置文件&#xff1a; vi /etc/systemd/system/ DELETED.service [Unit] DescriptionV2Ray Service Documentation DELETED Afternetwork.target nss-lookup.target[Service] #Usernobody CapabilityBoundingSetCAP_NET_ADMIN CAP_NET_BIN…

intra-mart实现logicDesigner与forma联动

一、前言 有一个需求&#xff0c;想实现从页面上传一个excel文件&#xff0c;点击提交&#xff0c;就转发给forma模块&#xff0c;然后用户在forma模块里&#xff0c;确认下自动填写的信息是否正确&#xff0c;正确的话就点击保存&#xff0c;存入数据库&#xff1b;不正确的话…

优选算法的智慧之光:滑动窗口专题(二)

专栏&#xff1a;算法的魔法世界​​​​​​ 个人主页&#xff1a;手握风云 目录 一、例题讲解 1.1. 最大连续1的个数 III 1.2. 找到字符串中所有字母异位词 1.3. 串联所有单词的子串 1.4. 最小覆盖子串 一、例题讲解 1.1. 最大连续1的个数 III 题目要求是二进制数组&am…

Harbor端口更改||Harbor端口映射

Harbor端口更改|Harbor端口映射 目标&#xff1a;将端口更改为8930 前言 [rootk8s-node1 harbor]# ls common common.sh docker-compose.yml harbor.v2.5.0.tar.gz harbor.yml harbor.yml.tmpl install.sh LICENSE prepare如上是Harbor的文件目录 更改harbor.yml文件…

PGlite:浏览器中运行的PostgreSQL

PGlite 是一款基于 WebAssembly&#xff08;WASM&#xff09;构建的轻量级 PostgreSQL 数据库引擎&#xff0c;旨在简化开发者在浏览器、Node.js、Bun 或 Deno 环境中运行 PostgreSQL。PGlite 无需复杂的安装或配置&#xff0c;特别适合开发测试、本地化应用及快速原型设计。 一…

DeepSeek集成到VScode工具,让编程更高效

DeepSeek与VScode的强强联合&#xff0c;为编程效率树立了新标杆。 DeepSeek&#xff0c;一款卓越的代码搜索引擎&#xff0c;以其精准的索引和高速的检索能力&#xff0c;助力开发者在浩瀚的代码海洋中迅速定位关键信息。 集成至VScode后&#xff0c;开发者无需离开熟悉的编辑…

蓝桥杯 - 每日打卡(类斐波那契循环数)

题目: 解题思路&#xff1a; 假设输入数值为number 分析题目&#xff0c;如果想要解决这个问题&#xff0c;我们需要实现两个方法&#xff0c;第一个检查number是否是类斐波那契&#xff0c;第二个是模拟1e7 - 0的过程&#xff0c;因为是求最大的&#xff0c;那么我们从1e7开始…

JavaScript实现著名的“两数之和”问题

下面是使用 JavaScript 实现“两数之和”问题的一种常见解法&#xff0c;利用哈希表&#xff08;Map&#xff09;存储遍历过的数字和它们对应的下标&#xff0c;从而在一次遍历中完成查找。以下是详细的代码和说明&#xff1a; function twoSum(nums, target) {// 创建一个 Ma…

【微信小程序】每日心情笔记

个人团队的比赛项目&#xff0c;仅供学习交流使用 一、项目基本介绍 1. 项目简介 一款基于微信小程序的轻量化笔记工具&#xff0c;旨在帮助用户通过记录每日心情和事件&#xff0c;更好地管理情绪和生活。用户可以根据日期和心情分类&#xff08;如开心、平静、难过等&#…

【数据结构】什么是栈||栈的经典应用||分治递归||斐波那契问题和归并算法||递归实现||顺序栈和链栈的区分

文章目录 &#x1f967;栈的初步理解&#xff1a;&#x1f967;易错&#xff1a;如何判断栈满&#x1f967;栈满理解&#x1f967;栈的基本运算&#x1f4da;栈操作的伪代码逻辑&#xff08;顺序和链栈&#xff09;&#x1f4d5;顺序栈运算实现&#xff1a;顺序栈的表示&#x…

利用opencv_python(pdf2image、poppler)将pdf每页转为图片

1、安装依赖pdf2image pip install pdf2image 运行.py报错&#xff0c;因为缺少了poppler支持。 2、安装pdf2image的依赖poppler 以上命令直接报错。 改为手工下载&#xff1a; github: Releases oschwartz10612/poppler-windows GitHub 百度网盘&#xff1a; 百度网盘…

IDEA + DeepSeek 实现 AI辅助编程,提升效率10倍(全网超详细的终极图文实战指南)

前言 在软件开发的世界里&#xff0c;每个开发者都经历过这样的困境——在重复的CRUD代码中机械劳动&#xff0c;为复杂的业务逻辑调试数小时&#xff0c;或是在海量文档中寻找某个API的正确用法。传统的IDE工具虽能提供基础支持&#xff0c;却难以突破效率的“玻璃天花板”。而…

青训营:简易分布式爬虫

一、项目介绍 该项目是一个简易分布式爬虫系统&#xff0c;以分布式思想为基础&#xff0c;通过多节点协作的方式&#xff0c;将大规模的网页抓取任务分解&#xff0c;从而高效、快速地获取网络数据 。 项目地址&#xff1a;https://github.com/yanchengsi/distributed_crawle…

论坛系统测试报告

目录 一、项目背景二、论坛系统测试用例思维导图三、论坛系统测试3.1界面测试3.2登陆测试3.3主页测试3.4个人中心测试 四、自动化测试脚本4.1配置驱动4.2创建浏览器类4.3功能测试4.3.1登陆测试4.3.2注册测试4.3.3主页测试4.3.4帖子编辑4.3.5运行主代码 五、BUG分析六、测试总结…

C++ std::vector 超详细指南:基础实践(手搓vector)

目录 一.基本概念 二.类的常用接口说明 1.类对象的常见构造 2. vector类空间变化 1&#xff09;.size()&#xff08;获取数据个数&#xff09; 2&#xff09;.capacity()&#xff08;获取容量大小&#xff09; 3&#xff09;.empty()&#xff08;判断是否为空&#xff0…

文件上传漏洞:upload-labs靶场11-20

目录 pass-11 pass-12 pass-13 pass-14 pass-15 pass-16 pass-17 pass-18 pass-19 pass-20 pass-11 分析源代码 &#xff0c;发现上传文件的存放路径可控 if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_ext substr($_FILES[upload_file][name],st…

AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型(LLM)应用开发平台

AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型&#xff08;LLM&#xff09;应用开发平台 目录 AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型&#xff08;LLM&#xff09;应用开发平台 一、简单介绍 二、Docker 下载安…