【遇到dfs问题,点进来看看思路】【dfs本质之一 全排列思想解决大部分dfs】例题1.全排列 例题2.单词接龙

news2024/11/25 10:20:51

在这里插入图片描述

总之就是
在已知格线上,填充可用数据,
如果回退到A,那么把A之前所用数据,换一个,并且A之后的数据都重新填写
这就是全排列
(截取的最关键部分,往下看)

这样的话,就是dfs的本质,
当一个方案不行,是中间的哪一步不行,那么我们改变这一步,继续dfs即可
(截取的最关键部分,往下看)

欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)
 
文章字体风格:
红色文字表示:重难点★✔
蓝色文字表示:思路以及想法★✔
 
如果大家觉得有帮助的话,感谢大家帮忙
点赞!收藏!转发!

dfs深搜讲解本质

    • 1. 单词接龙
        • 本题还有个关键就是 预处理

我对于dfs理解 源于一道非常经典的例题

就是 全排列问题

如下

在这里插入图片描述
在这里插入图片描述

#include<iostream>
using namespace std;
const int N = 10;
int path[N];//保存序列
int state[N];//数字是否被用过
int n;
void dfs(int u)
{
    if(u > n)//数字填完了,输出
    {
        for(int i = 1; i <= n; i++)//输出方案
            cout << path[i] << " ";
        cout << endl;
    }

    for(int i = 1; i <= n; i++)//空位上可以选择的数字为:1 ~ n
    {
        if(!state[i])//如果数字 i 没有被用过
        {
            path[u] = i;//放入空位
            state[i] = 1;//数字被用,修改状态
            dfs(u + 1);//填下一个位
            state[i] = 0;//回溯,取出 i
        }
    }
}

int main()
{

    cin >> n;
    dfs(1);
    return 0;
}

这道经典题,就不解析了。大家可以看代码理解一下

主要是上面的图,有助于我们解决dfs问题

上述的图 是一个树,表示出来dfs的本质

也就是 dfs最开始是知道 需要填充多少个格线的
(如果不知道也可以)

总之就是
在已知格线上,填充可用数据,
如果回退到A,那么把A之前所用数据,换一个,并且A之后的数据都重新填写
这就是全排列

1. 单词接龙

在这里插入图片描述

#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 21;

int n;
string word[N];
int g[N][N];//代表编号i的可以被j拼接  如i:asd,j:sdf,拼接长度为最小值g[i][j] = 2,i从0开始记位
int used[N];//编号为i的单词使用次数
int ans;

void dfs(string dragon, int last) 
{
    ans = max((int) dragon.size(), ans);//取最大值,dragon.size()为当前合并的长度

    used[last]++;//编号为last的单词被用次数++;

    for (int i = 0; i < n; i++)
        if (g[last][i] && used[i] < 2)//used[i]<2代表单词用次数不超过2
            dfs(dragon + word[i].substr(g[last][i]), i); //编号为last的可以被i拼接现在尾巴为i号

    used[last]--;//恢复现场
}

int main() {
    cin >> n;
    for (int i = 0; i < n; i++) cin >> word[i];
    char start;
    cin >> start;//首字母

    for (int i = 0; i < n; i++)//遍历得到各个g[i][j]
        for (int j = 0; j < n; j++) {
            string a = word[i], b = word[j];
            for (int k = 1; k < min(a.size(), b.size()); k++)
                if (a.substr(a.size() - k, k) == b.substr(0, k)) {
                    g[i][j] = k;
                    break;
                }
        }

    for (int i = 0; i < n; i++)//找到首字母为strat的单词开始做dfs,dfs中会自动找到最大值
        if (word[i][0] == start)
            dfs(word[i], i);//从word[i]开始遍历,i代表现在是第几个单词

    cout << ans << endl;

    return 0;
}

本题还有个关键就是 预处理

在这里插入图片描述

预处理这个思想很重要,

这道题是怎么预处理的呢?

由于我们需要知道,所有单词之间,两两关系
所以我们预先

for (int i = 0; i < n; i++)//遍历得到各个g[i][j]
    for (int j = 0; j < n; j++) {
        string a = word[i], b = word[j];
        for (int k = 1; k < min(a.size(), b.size()); k++)
            if (a.substr(a.size() - k, k) == b.substr(0, k)) {
                g[i][j] = k;
                break;
            }
    }

上述,我们已经总结出,当遇到dfs问题,我们就想到用全排列的想法,填方格过程解决思考dfs

但是有时候不一定是 填方格那样思考

我们总结一个思考方式就是

当遇到dfs问题,我们就想,这道题是否可以
用这种方案直接,如果不行,是方案中的哪一步不可以,然后改变这一步,再继续想方法

这样的话,就是dfs的本质,
当一个方案不行,是中间的哪一步不行,那么我们改变这一步,继续dfs即可

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

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

相关文章

【节点边际电价】机组运行约束对机组节点边际电价的影响分析(Matlab代码实现)​

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

2023年美国大学生数学建模竞赛F题绿色GDP解题全过程文档及程序

2023年美国大学生数学建模竞赛 F题 绿色GDP 原题再现&#xff1a; 背景   国内生产总值(GDP)可以说是衡量-一个国家经济健康状况的最知名和最常用的指标之一。它通常被用于确定一个国家的购买力和获得贷款的机会&#xff0c;为国家提出促进其gdp的政策和项目提供动力。GDP衡…

Springboot +Flowable,流程表单应用之外置表单(HTML形式)(一)

一.简介 整体上来说&#xff0c;我们可以将Flowable 的表单分为三种不同的类型&#xff1a; 动态表单 这种表单定义方式我们可以配置表单中每一个字段的可读性、可写性、是否必填等信息&#xff0c;不过不能定义完整的表单页面。外置表单 外置表单我们只需要定义一下表单的 k…

国考省考行测:求基期量,去年的量,增长率r小于6%化除为乘,否则直接相除

国考省考行测&#xff1a;求基期量&#xff0c;去年的量 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带行测和申论&#xff0c;而常规国考省考最重要的还是申论和行测&#xff0c;所以大家认真准备吧&#xff0c;我讲一起屡屡申论和…

AIGC产业研究报告2023——三维生成篇

定义 人工智能三维生成是指利用深度神经网络学习并生成物体或场景的三维模型&#xff0c;并在三维模型的基础上将色彩与光影赋予物体或场景使生成结果更加逼真。在应用中&#xff0c;生成物体或场景的三维模型称为三维建模&#xff0c;生成三维模型的色彩与光影称为三维渲染。…

在博客逮到一个阿里8年测试开发,聊过之后我悟了....

老话说的好&#xff0c;这人呐&#xff0c;一旦在某个领域鲜有敌手了&#xff0c;就会闲得疋虫疼。前几天我在上班摸鱼刷社区的时候认识了一位腾讯测试开发大佬&#xff0c;在阿里工作了8年&#xff0c;因为本人天赋比较高&#xff0c;平时工作也兢兢业业&#xff0c;现在企业内…

异常检测相关论文记录

1、Unsupervised anomaly detection algorithms on real-world data: how many do we need?真实世界数据的无监督异常检测算法&#xff1a;我们需要多少&#xff1f; Abstract&#xff1a; 将所考虑的算法在所有数据集上的相对性能进行可视化和聚类&#xff0c;我们确定了两个…

10分钟轻松实现三菱FX3UPLC连接阿里云平台

MQTT协议网关串口连接三菱FX3UPLC操作说明v1.3 目录 一. 使用流程 二. 准备工作 2.1 需要准备如下物品 2.2 LF220网关准备工作 2.3 PLC准备工作 2.4 电脑的准备工作 2.5 MQTT服务器准备工作 三. 阿里云IoT平台配置步骤 3.1 创建产品 3.2 添加设备 3.3 配…

pip下载包报错ERROR: No matching distribution found for xxx时的解决方案

前言 当我们使用python自带的pip安装一些包时&#xff0c;可能会报以下错误&#xff1a; 出现这种情况有三种可能&#xff1a; 第一种可能&#xff1a; pip的版本过低&#xff0c;需要升级一下&#xff0c;可以执行以下命令进行尝试 python -m pip install --upgrade pip第…

MySQL---存储函数、触发器

1. 存储函数 MySQL存储函数&#xff08;自定义函数&#xff09;&#xff0c;函数一般用于计算和返回一个值&#xff0c;可以将经常需要使用的计算 或功能写成一个函数。 存储函数和存储过程一样&#xff0c;都是在数据库中定义一些 SQL 语句的集合。 存储函数与存储过程的区…

如何裁剪图片,裁剪图片的几个方法

如何裁剪图片&#xff0c;裁剪图片的几个方法你知道吗&#xff1f;在日常生活中&#xff0c;当浏览图片时&#xff0c;常会想要对某些图片进行裁剪&#xff0c;或从生活照片中裁剪自己的部分。如何处理这种情况&#xff1f;裁剪图片可去除图像不必要的部分&#xff0c;让其更美…

[日记]LeetCode算法·二十六——二叉树⑥ 红黑树(插入与删除,附图)

承接上一篇AVL树AVL树&#xff0c;红黑树相较于AVL树&#xff0c;就相当于完全二叉树相当于AVL树&#xff0c;如何在性能退化和维护成本之间做出CS中经典的trade-off 文章目录 红黑树的概念红黑树查询效率红黑树的插入1 插入节点N为根节点2 插入节点N的父节点P为黑色3 N的父节…

雷鸟Air Plus体验:视觉大幅升级,影视/办公/游戏全能胜任

雷鸟BirdBath系列XR眼镜一直保持着较快的迭代频率&#xff0c;如今迎来该系列第三款产品&#xff1a;雷鸟Air Plus&#xff0c;新品在视觉体验上得到大幅升级&#xff0c;不仅FOV达到49&#xff0c;边缘成像质量更高&#xff0c;搭配索尼旗舰级Micro OLED屏实现最高120Hz刷新率…

LoRa温振变送器的类型特点及技术参数

自电器文明开始&#xff0c;短短一个世纪&#xff0c;我们对科学探索已经从工业到达了智能化的程度。传感器的应用&#xff0c;不断为时代带来惊喜&#xff0c;各行各业都在争相抓紧契机&#xff0c;利用科技不断创新&#xff0c;推动着整个传感器行业的发展。在工业自动化系统…

redis单机版本Java代码实践

pom依赖 引入redis的starter以及commons-pool2的依赖&#xff0c;commons-pool2是配置连接池需要使用的&#xff0c;不引入&#xff0c;只有连接池配置是不会创建连接池的 <!-- redis --><dependency><groupId>org.springframework.boot</groupId><…

k8s的一些基本概念

目录 masterNodePod和ContainerControllerService和IngressLabelSecretVolumeReplicationController和ReplicaSetDeploymentDaemonSetJobCronJobStatefulSetNamespace 推荐k8s中文文档&#xff0c;里面有各种概念的具体用法http://docs.kubernetes.org.cn/437.html 一个k8s集群…

Spring Boot 整合MyBatis 和 Spring Boot 整合MyBatis-Plus

目录 Spring Boot 整合MyBatis 代码配置实现 创建数据库和表 使用灵活的方式创建maven 创建resources/application.yml &#xff0c;配置数据源参数, 并完成Spring Boot 项目启动测试 测试DruidDataSourceConfig 创建MonsterMapper接口 创建resources\mapper\MonsterMap…

开发笔记之:文件读取溢出分析(QT C++版)

&#xff08;1&#xff09;引言 以下是QT C读取数据文件&#xff08;QDataStream&#xff09;的代码&#xff1a; /*** 按双字读取* param fis 文件输入流* param isBigEndian 是否大头&#xff08;字节序&#xff09;* return 双字值*/ DWORD FsFileUtil::readAsD…

工欲善其事必先利其器——开发神器(IDEA)

&#x1f525;IDEA 简介&#x1f525;IDEA的特色功能&#x1f525;IDEA的优点&#x1f525;IDEA 的使用&#x1f525;IDEA的常用快捷键 &#x1f525;IDEA 简介 IDEA 全称 IntelliJ IDEA&#xff0c;是 java 编程语言开发的集成环境&#xff0c;被公认为最好的 java 开发工具之…

如何轻松搭建一套行情回放系统

一个量化策略在生产&#xff08;交易&#xff09;环境中运行时&#xff0c;实时数据的处理通常是由事件驱动的。为确保研发和生产使用同一套代码&#xff0c;通常在研发阶段需将历史数据&#xff0c;严格按照事件发生的时间顺序进行回放&#xff0c;以此模拟交易环境。在 Dolph…