第五十四章 DFS进阶(二)——迭代加深

news2024/11/18 2:33:49

第五十四章 DFS进阶(二)——迭代加深

  • 一、DFS的缺陷
  • 二、迭代加深
    • 1、什么是迭代加深
    • 2、复杂度分析
    • 3、算法步骤
  • 三、例题
    • 1、问题
    • 2、分析
    • 3、代码

一、DFS的缺陷

我们知道DFS是一条路走到黑,直到将整条路走完以后才会回头。

这就导致了一个问题,路很多,你没有办法确定当下走的路就是正确的,同时,如果这条路是错误的,却又无比的长。这就会导致你在错误的路上越走越远。

示意图如下图所示:
在这里插入图片描述
红色点是答案,而如果我们不幸地从左侧的最长的方案开始搜索的话,就会导致我们在错误的路上越走越远。那么为了解决这类极端的情况,我们就需要使用迭代加深的算法。

二、迭代加深

1、什么是迭代加深

迭代加深就是我们规定一个DFS的深度,如果到了该深度还没有找到答案的话,我们就及时收手,换一条路搜索,如果在该深度下,没有任何一条路是答案的话,我们就增加DFS的深度,再从头开始来一遍。

很明显这样做的话,我们就解决了在一条错误地路上越走越远的困境,但是很明显,在每个深度中,它都在不断地从头尝试每一种方案,这就造成了很多重复的步骤,那么这种重复的现象对我们时间复杂度有什么影响呢?

我们看下面的分析。

2、复杂度分析

我们这里分析的主要是刚才的问题,重复的搜索是否会影响到该算法的效率。我们看一下最坏情况下,假设我们每次只有两个选择,即整个搜索树是一个满二叉树,此时我们这个算法的时间复杂度是怎样的。

在这里插入图片描述
假设我们遍历了每一个分支,那么在遍历最后一排的时候,我们会重复遍历最后一排上面的所有节点,但是即使是在这种情况下,我们重复遍历一遍的节点数也只是接近于我们最后一排的节点数。

也就是说在最坏条件下,影响也没有那么大。

3、算法步骤

这个算法的过程还是比较简单的,就是我们把搜索深度设置为1,然后开始搜索,如果当前深度没有搜到答案的话,我们就递增深度。直到搜索到答案,这个过程可以写成一个while循环。

三、例题

1、问题

在这里插入图片描述

2、分析

这道题的话,需要满足几个条件:
1、第一个元素和最后一个元素是固定的。
2、中间的元素是严格单调递增的。
3、当前元素等于前面某两个的和

那么最坏条件下, 就是从1,2,3,4,5…开始逐渐递增,那么到达最大值的话,大概是100层。

最好条件下,就是指数级别的增长,1,2,4,8,16,32,64,128。最多8层。

我们发现最好情况和最坏情况之间差了90多层。面对这种极端情况,我们就需要使用我们的迭代加深了。

3、代码

#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 110;
int path[N];
int n;

bool dfs(int u, int deep)
{
	if(u > deep)return false;
	if(path[u - 1] == n)return true;

	bool st[N] = {0};
	for(int i = u - 1; i >= 0; i -- )
		for(int j = i; j >= 0; j -- )
		{
			int x = path[i] + path[j];
			if(x > n || x <= path[u - 1] || st[x])continue;
			st[x] = true;
			path[u] = x;
			if(dfs(u + 1, deep))return true;
		}

	return false;
}

void solve()
{
	while(cin >> n, n)
	{
		path[0] = 1;
		
		int deep = 1;
		
		while(!dfs(1, deep))deep ++;
    
		for(int i = 0; i < deep; i ++ )
			cout << path[i] << " ";
		
		cout << endl;
	}

	
}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	solve();
}

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

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

相关文章

dynamic-Echonet左心室语义分割——学习记录

1简单介绍 1.1 论文简介 论文地址Video-based AI for beat-to-beat assessment of cardiac function 数据集地址&#xff1a;here获取好像还挺麻烦的。需要在网站上填写并申请数据集&#xff0c;斯坦福那边会发邮件并拉入一个box组&#xff0c;就可以访问公开的超声心动数据集…

图解LeetCode——剑指 Offer 26. 树的子结构

一、题目 输入两棵二叉树A和B&#xff0c;判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构&#xff0c; 即&#xff1a;A中有出现和B相同的结构和节点值。 二、示例 2.1> 示例 1&#xff1a; 【输入】A [1,2,3], B [3,1] 【输出】false 2.2> 示…

数字化转型的成功模版,珠宝龙头曼卡龙做对了什么?

2月11日&#xff0c;曼卡龙&#xff08;300945.SZ&#xff09;发布2022年业绩快报&#xff0c;报告期内&#xff0c;公司实现营业收入16.11亿元&#xff0c;同比增长28.63%。来源&#xff1a;曼卡龙2022年度业绩快报曼卡龙能在2022年实现营收增长尤为不易。2022年受疫情影响&am…

c语言操作文件

1、文件缓冲区 文件缓冲区的目的&#xff1a;提高访问效率 提高磁盘使用寿命 刷新就是将当前缓冲区数据全部提交。 不刷新时&#xff0c;程序在崩溃时缓冲区内容无法输出&#xff08;有些情形会带来错误&#xff09; 文件缓冲区的四种刷新方式 行刷新&#xff08;遇到换行符…

CSS3新增属性( 过渡、变形和动画)

文章目录一、过渡1、transition-property2、transition-duration3、transition-timing-function4、transition-delay二、变形1、transform2、2D变形2.1、平移&#xff08;translate&#xff09;2.2、缩放&#xff08;scale&#xff09;2.3、倾斜&#xff08;shew&#xff09;2.…

【记录】smartctl|Linux如何通过smartctl查看有没有坏的磁盘?以及使用时长、电源周期、故障记录等

smartctl是一个用于监测和分析硬盘健康状态的工具&#xff0c;可以用于检测是否存在坏的磁盘。以下是使用smartctl检查磁盘健康状态的步骤&#xff1a; 安装smartctl软件 在Linux系统中&#xff0c;smartctl通常包含在smartmontools软件包中。如果您还没有安装smartmontools&am…

Mr. Cappuccino的第38杯咖啡——Kubernetes中Pod、Namespace、Label、Deployment、Service之间的关系

Kubernetes中Pod、Namespace、Label、Deployment、Service之间的关系Pod、Namespace、Label、Deployment、Service之间的关系NamespacePod1. 创建一个namespace并运行一个pod2. 查看pod3. 删除pod4. 删除pod控制器Label1. 创建yaml文件&#xff08;nginx-pod.yaml&#xff09;2…

【数据结构与算法】二分查找 移除元素

今日任务 数组理论基础 704.二分查找 27.移除元素 1.数组理论基础 &#xff08;1&#xff09;数组是存放在连续内存空间上的相同类型数据的集合。 注意&#xff1a; 数组下标都是从0开始的数组内存空间的地址是连续的 &#xff08;2&#xff09;正因为数组在内存空间的…

【C语言】字符串处理函数及典例(2)

接上&#xff1a;【C语言】字符串处理函数及典例&#xff08;1&#xff09; 之前在&#xff08;1&#xff09;中讨论的函数如strcpy&#xff0c;strcmp&#xff0c;strcat &#xff0c;都是长度不受限制函数&#xff0c;即不管参数的大小&#xff0c;关键点都是找到 \0 &…

ChatGPT爆火出圈,高质量文本标注数据成关键

“2022年11月30日&#xff0c;OpenAI发布了ChatGPT——一个对话式AI&#xff0c;上线仅五天&#xff0c;注册用户数突破100万&#xff0c;爆火出圈&#xff0c;成为社会热议话题。截止今年1月末&#xff0c;ChatGPT的月活用户数量破亿&#xff0c;成为史上用户数增长最快的消费…

Java字节流

4 字节流 字节流抽象基类 InputStream&#xff1a;这个抽象类是表示字节输入流的所有类的超类OutputStream&#xff1a;这个抽象类是表示字节输出流的所有类的超类子类名特点&#xff1a;子类名称都是以其父类名作为子类名的后缀 4.1 IO流概述和分类 IO流概述&#xff1a; …

Spring之基于xml的自动装配、基于Autowired注解的自动装配

文章目录基于xml的自动装配①注解②扫描③新建Maven Module④创建Spring配置文件⑤标识组件的常用注解⑥创建组件⑦扫描组件⑧测试⑨组件所对应的bean的id基于注解的自动装配①场景模拟②Autowired注解③Autowired注解其他细节④Autowired工作流程Autowire 注解的原理Qualifier…

深圳的商户们有福啦!小微企业、个体工商户的扶持举措又来了!

深圳的商户们有福啦&#xff01;近日&#xff0c;深圳8部门联合印发《关于进一步支持中小微企业纾困及高质量发展的若干措施》&#xff0c;从纾困和高质量发展的角度&#xff0c;在降低企业生产经营成本、有效扩大市场需求、支持中小企业创新发展、促进中小企业转型升级4个方面…

2.Visual Studio下载和安装

Visual Studio 是微软提供的一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于为 Windows 系统开发应用程序。Visual Studio 提供了构建 .Net 平台应用程序的一站式服务&#xff0c;可以使用 Visual Studio 开发、调试和运行应用程序。 1、Visual Studio下载 …

ESP-C3入门9. 创建TCP Server

ESP-C3入门9. 创建TCP Server一、ESP32 IDF的TCP/IP协议栈二、BSD套接字API介绍三、创建TCP Server的步骤1. 引用TCP/IP协议栈2. 创建 TCP套接字拼绑定端口3. 接收客户端请求4. 启动服务四、完整代码1. wifi.h2. wifi.c3. tcpServer.h4. tcpServer.c5. main.c6. CmakeLists.txt…

BNB Greenfield 成存储赛道“新贵”,BNB 生态的野心与破局

“从BNB Beacon Chain&#xff0c;到BNB Chain&#xff0c;再到BNB Greenfield &#xff0c;三位一体的 BNB 生态格局正式形成。 ”在今年的2月1日&#xff0c;币安发布了分布式存储链BNB Greenfield&#xff0c;根据白皮书信息&#xff0c;它的特别之处在于其不仅具备基于SP&a…

完成四种方式的MySQL安装

1.仓库安装 1.1查看版本和安装mysql包 [rootlocalhost ~]# cat /etc/redhat-release Red Hat Enterprise Linux release 9.1 (Plow) [rootlocalhost ~]# rpm -ivh https://repo.mysql.com/mysql80-community-release-el9-1.noarch.rpm1.2装包 [rootlocalhost ~]# dnf instal…

千峰jquery【案例】

滑动选项卡&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content"widt…

RabbitMQ学习(六):发布确认

一、发布确认的原理生产者将信道设置成 confirm 模式&#xff0c;一旦信道进入 confirm 模式&#xff0c;所有在该信道上面发布的 消息都将会被指派一个唯一的 ID(从 1 开始)&#xff0c;一旦消息被投递到所有匹配的队列之后&#xff0c;broker 就会发送一个确认给生产者(包含消…

V4l2框架基础知识(一)

V4L2框架-v4l2 device V4l2视频设备驱动基础 1.V4L2是专门为linux设备设计的整套视频框架&#xff08;其主要核心在linux内核&#xff0c;相当于操作系统上层的视频源捕获驱动框架&#xff09;&#xff0c;为上层访问系统底层的视频设备提供了一个统一的标准接口&#xff0c;…