迭代加深搜索(iddfs)

埃及分数问题 迭代加深搜索(IDDFS) 题目传送门:【CodeVS 1288】 题目大意:在古埃及,人们使用单位分数的和(形如1/a的分数, a是自然数)表示一切有理数。 如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的。 对于一个分数a/b,表示方法有很多种,但是哪种最好呢? 首先,加数少的比加数多的好,其次,加数个数相同的,最小的分数越大越好。 如: 19/45=1/3 + 1/12 + 1/ 阅读详情

做法:

从根节点开始 d f s dfs dfs,用一个变量 d e p dep dep限制 d f s dfs dfs的深度,一旦达到 d e p dep dep层,那么就看是否找到目标;如果在 d e p dep dep层没有搜索到目标,那么就将深度的限制 d e p + 1 dep+1 dep+1,继续从根节点重新开始 d f s dfs dfs,如此反复直到找到目标,或者证明目标不存在;

适用于的题目

  1. 能够从题目中推断出答案的层次较浅;
  2. 整个搜索树非常的深而且随着深度的增加,结点增加非常快速;

优势

  1. 相比于dfs,防止一条路走到底,避免超时
  2. 相比于bfs,防止在队列中存储的状态过多,避免超空间;

劣势:

每一次都需要从根节点重新开始搜索,会导致重复;

代码基本框架

bool dfs(int cur)
{
	if (cur==dep)
	{
		return true/false;
	}
	for (cur的邻居)
	{
		if(dfs(next)==true)
		{
			return true;
		}
	}
	return false;
}

int main()
{
	dep=1;
	while (dfs(root)==false)
	{
		dep++;
	}
}

例题:

Sample 1:POJ2248 Addition Chains/UVA529 Addition Chains

思路:
  • 搜索的逻辑,从第1个数开始搜索,对于待搜索的第i项,只可能由1到-1的两个数值加起来得到。

注意,需要剪枝,分别是排除重复以及优化搜索顺序

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
const int maxn=105;
const int INF=0x3f3f3f3f;
int n,dep;
int ans[maxn];
inline int read()
{
	int s=0,f=1;
	char c=getchar();
	while (c<'0'||c>'9')
	{
		if (c=='-')
		{
			f=-1;
		}
		c=getchar();
	}
	while (c>='0'&&c<='9')
	{
		s=(s<<1)+(s<<3)+c-'0';
		c=getchar();
	}
	return s*f;
}
inline void write(int x)
{
	if (x<0)
	{
		x=~(x-1);
		putchar('-');
	}
	if (x>9)
	{
		write(x/10);
	}
	putchar(x%10+'0');
}
inline bool dfs(int cur)							//目前已经在位置1到cur找到结果
{
	if (cur==dep)									//搜索到与 当前迭代的深度的限制相等
	{
		return ans[cur]==n;
	}
	bool vis[maxn]={false};                         //排除重复(剪枝)
	for (int i=cur;i>=1;i--)                        //优化搜索顺序(剪枝)
	{
		for (int j=i;j>=1;j--)						//i,j可以相等
		{
			int num=ans[i]+ans[j];					//和
			if (num<=n&&num>ans[cur]&&vis[num]==false)
			{
				ans[cur+1]=num;
				if (dfs(cur+1)==true)
				{
					return true;
				}
				else
				{
					vis[num]=true;
				}
			}
		}
	}
	return false;
}

int main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	ans[1]=1;
	while (17)
	{
		n=read();
		if (n==0)
		{
			break;
		}
		dep=1;
		while (dfs(1)==false)
		{
			dep++;									//迭代深度
		}
		for (int i=1;i<=dep;i++)
		{
			write(ans[i]);
			printf(" ");
		}
		puts("");
	}
	return 0;
}

Sample 2:POJ3134 Power Calculus/UVA1374 快速幂计算 Power Calculus

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
const int maxn=100005;
const int INF=0x3f3f3f3f;
int n,dep;
int ans[maxn];
inline int read()
{
	int s=0,f=1;
	char c=getchar();
	while (c<'0'||c>'9')
	{
		if (c=='-')
		{
			f=-1;
		}
		c=getchar();
	}
	while (c>='0'&&c<='9')
	{
		s=(s<<1)+(s<<3)+c-'0';
		c=getchar();
	}
	return s*f;
}
inline void write(int x)
{
	if (x<0)
	{
		x=~(x-1);
		putchar('-');
	}
	if (x>9)
	{
		write(x/10);
	}
	putchar(x%10+'0');
}
inline bool dfs(int cur)
{
	if (cur==dep)
	{
		return ans[cur]==n;
	}
	int maxi=-INF;
	for (int i=1;i<=cur;i++)
	{
		maxi=max(maxi,ans[i]);
	}
	if ((maxi<<(dep-cur))<n)
	{
		return false;
	}
	for (int i=cur;i>=0;i--)
	{
		ans[cur+1]=ans[cur]+ans[i];
		if (dfs(cur+1)==true)
		{
			return true;
		}
		ans[cur+1]=ans[cur]-ans[i];
		if (dfs(cur+1)==true)
		{
			return true;
		}
	}
	return false;
}
int main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	while (1)
	{
		n=read();
		if (n==0)
		{
			break;
		}
		dep=0;
		ans[0]=1;
		while (dfs(0)==false)
		{
			dep++;
		}
		write(dep);
		puts("");
	}
	return 0;
}
/*
1
31
70
91
473
512
811
953
0
*/
高级搜索之迭代加深算法详解 可能很多初学者看到了迭代加深搜索这个名字就感觉“哇,好高级啊,学起来一定很复杂。” 但是事实却不是这样,只要你有过BFS和DFS的基础,理解起来其实是非常容易的。 为了形象地解释迭代加深搜索(IDDFS,Iterative Deepening Depth-first Search。网上找了一下,发现并没有这个全称。) 从图中可以看出,从起点开始搜索。使用DFS,搜到的第一个解便是X3。而使用BF... 阅读详情

相关推荐

迭代加深搜索、启发式搜索、A*、IDA

迭代加深搜索(IDDFS)是深度优先搜索,与普通的dfs不同的是,每次深搜都会有搜索的最大深度限制,如果没有找到解,那么就增大深度,再进行深搜,如此循环直到找到的解为止,这样可以找到最浅层的解。IDDFS适和求解:搜索深度较深,但正确的解再较浅的深度的问题。IDDFS的使用前提是:一定要有解。A*算法,A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法。IDA*算法是:基于迭代加深的A*算法。

xuxianshun666的博客 1936

迭代加深搜索

迭代加深搜索就是控制了搜索深度的dfs,总体来看像一个bfs,这样将深搜和广搜结合起来,且通过剪枝灵活地控制宽度与深度,就很好的解决了dfs时间复杂度高和bfs队列高内存的弊端,提高了搜索的效率。...

m0_62878102的博客 2721

[codevs 1288] 埃及分数 [IDdfs 迭代加深搜索 ]

题目描述 Description 在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数。 如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的。 对于一个分数a/b,表示方法有很多种,但是哪种最好呢? 首先,加数少的比加数多的好,其次,加数个数相同的,最小的分数越大越 好。 如: 19/45=1/3 + 1/12 + 1/180 19/45=1/

skysys的研究小屋 1783

迭代加深搜索(IDDFS)的原理与练习

目录 一、什么是迭代加深搜索? 二、优势和劣势 三、练习:POJ 2286 - The Rotation Game AC代码以及注释 一、什么是迭代加深搜索? 首先,它是深度优先搜索,其次它与普通深度优先搜索不同的是,每次深搜都会有搜索的最大深度限制,如果没有找到解,那么就增大深度,再进行深搜,如此循环直到找到解为止,这样可以找到最浅层的解。 标志性的结构如下: for(idt=0;; idt++) if(dfs(0)) break; 或者 whi...

m0_56422883的博客 1940

信奥赛C++提高组csp-s之搜索进阶(迭代加深IDDFS)

信奥赛C++提高组csp-s之搜索进阶(迭代加深IDDFS)

王老师青少年编程 593

告别裸机:在FreeRTOS上为STM32移植SOEM EtherCAT主站的思路与实战

本文详细介绍了在FreeRTOS环境下为STM32移植SOEM EtherCAT主站的工程实践。通过重构任务调度模型、优化内存管理和中断响应,成功将通信周期抖动控制在±100ns以内,满足工业控制系统的严苛实时性要求。文章包含完整的移植策略、性能优化方法和实测数据,为开发者提供了一套可靠的EtherCAT主站解决方案。

weixin_30342363的博客 388

一文读懂迭代加深搜索:从概念到实现,优缺点全面分析!

迭代加深搜索,这个名字听起来好像有些复杂,但其实它的基本思想非常简单。你可以把它想象成是在一座巨大的迷宫中寻找出口的过程。你开始时只能看到离你很近的地方,你试图探索所有你能够到达的路径,但是你并不知道哪条路径会通向出口。这就是迭代加深搜索的基本思想:一层一层地探索,每次都尽可能地深入,直到找到目标。这种方法在很多实际问题中都有应用,比如在人工智能中的路径规划,或者在网络科学中的社区发现等等。现在,你可能已经对迭代加深搜索有了一定的了解,但是你可能还在想,如何实现这个搜索方法呢?

万猫学社 3507

VBA学习笔记6:将多个工作表中满足条件的数据汇总到同一个工作表

VBA学习笔记6:将多个工作表中满足条件的数据汇总到同一个工作表

weixin_45355881的博客 4708

POJ 3134 Power Calculus(IDDFS迭代加深搜索)

迭代加深搜索(IDDFS) 迭代加深搜索其实就是一种dfs,它只不过是限制了每次搜索的深度,如果在以h为深度的搜索中没有找到答案,那么下一次就会以h+1的深度进行重新的搜索。 bfs基于队列来实现,每次以队首为参照,可以扩展出好多节点,才会释放队首的一个点,这样就会浪费大量的空间。而dfs却在找到最深处返回,释放掉一些没有用的点,这样它所用的空间比bfs小的多。但是如果让求一个最优解或者说是扩展深...

H4ppyD0g的博客 435

Habitat安装全网最详细教程,手把手带你跑通example.py(全网唯一)

全网最详细具身智能仿真平台habitat的安装教程

shannanshouyin的博客 2756

超速U盘选购避坑指南:如何通过Rx Detect机制识别真伪USB3.0设备

本文深入解析了USB 3.0超速U盘的选购避坑要点,重点介绍了通过Rx Detect机制识别真伪设备的核心原理。文章提供了从软件检测到实际性能测试的完整方案,帮助消费者和技术人员有效辨别虚假的USB3.0设备,确保获得真正的超速传输体验。

weixin_29189373的博客 443

C++ 迭代加深搜索(IDDFS):从原理到实战的深度解析

摘要: 本文深入解析C++中的迭代加深搜索(IDDFS)算法,该算法结合了DFS的空间效率和BFS的最优解特性。IDDFS通过迭代加深深度限制,逐步扩展搜索范围,既避免了DFS陷入深层无效路径的问题,又克服了BFS内存消耗大的缺点。文章详细讲解了IDDFS的核心原理、实现框架(包括外层迭代和内层深度受限DFS)以及经典应用场景(如迷宫最短路径)。通过代码示例展示了如何实现IDDFS解决实际问题,并强调其最优性、空间效率和时间效率的平衡优势。

互联网改遍了世界。 496

10倍开发者的 Dify 魔法书:从零构建全栈 AI 应用

“不懂底层算法,也能开发爆款 AI 应用吗?” 答案是:绝对可以。 Dify 正在重新定义 AI 应用的开发范式——通过可视化的低代码平台,将原本需要数周的开发周期压缩到几小时。无论你是前端、后端、产品经理,还是渴望破局的独立开发者,这都是你不可错过的红利。 我们将手把手教你利用 Dify 快速接入百模大战,零代码搭建企业级知识库,并一键发布你的专属 AI 助手、智能客服和自动化工作流。 告别重复造轮子,掌握 Dify,一个人就是一支 AI 团队。现在上车,开启你的 10 倍速开发之旅!

davidwang456的专栏 682

IDDFS迭代加深搜索

#include&lt;bits/stdc++.h&gt; using namespace std; const int maxn = 10; int n,a[maxn]; bool ans_sort(){ for(int i = 0;i &lt; n-1;i++){ if(a[i] &gt;= a[i]+1)return false; //判断是否有序 } ...

cj1064789374的博客 294

利用AWVS进行反制

awvs 10.5下载 http://www.32r.com/soft/12986.html

渗透之路,攻防之间皆学问 6653

电气设备Simlink仿真(Matlab)

目录 1、电气设备的分类及原理 2、直流输电控制与保护的仿真 (1)本次实验直流输电控制与保护的主电路: (2)直流输电的控制 2、资源下载(百度网盘) 1、电气设备的分类及原理 电气设备大体上可以分为一次设备、二次设备,本次仿真实验主要讲解的是高压直流输电的控制与保护仿真。高压直流输电的原理是整流和有源逆变的应用。下图是一个简单的单极直流输电系统,属于晶闸管的整流电路,交流通过晶闸管的整流变成直流,变成直流后通过长距离输电送往远端,送到远端的直流经过晶闸管的有源逆变变成交流,...

weixin_46039719的博客 1418

迭代加深搜索 (IDDFS)和IDA算法

迭代加深搜索 (IDDFS)和IDA算法 IDDFS: 我个人这个搜索的理解就是以BFS的思想写DFS。 具体来说就是,**首先深度优先搜索k层,若没有找到可行解,再深度优先搜索k+1层,直到找到可行解为止。**由于深度是从小到大逐渐增大的,所以当搜索到结果时可以保证搜索深度是最小的。这也是迭代加深搜索在一部分情况下可以代替广度优先搜索的原(还比广搜省空间)。 前提: 题目一定要有解,否则会无限循环下去。 好处: 1.时间复杂度只比BFS稍差一点(虽然搜索k+1层时会重复搜索k层,但是整体而言并不比广搜慢很

GitHub:https://github.com/myp020301 1642

YOLOv11改进策略【损失函数篇】| 替换激活函数为Mish、PReLU、Hardswish、LeakyReLU、ReLU6

在卷积神经网络中,激活函数通过在神经网络中引入非线性,使网络能够学习和逼近复杂函数,从而处理复杂的模式识别与分类问题。

Limiiiing的博客 2790

IDDFS(迭代加深搜索)基础题两则

课余时间仔细看了下教练给我们发的OI技能树,发现自己似乎连迭代加深搜索都不会打,看来自己大抵的确是变水了 _(:зゝ∠)_。惭愧,惭愧,好在现在学习为时不晚,还可以补救。 学习算法时,一个关键的问题是什么时候来使用它。在一些搜索问题中,使用普通的DFS可能会让你把时间浪费在深度非常大而且答案不是最优的搜索过程上,甚至有的时候DFS搜索的深度是无穷的,而BFS虽说理论上可以避免这种情况,却又无法满...

weixin_30340353的博客 215

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【代码超详解】UVA 11212 Editing a book 编辑图书(迭代加深搜索 IDDFS ,150 ms)

一、题目描述 已知一些段落,用 1 ~ n 编号,2 ≤ n ≤ 9 。给出开始时各段落的顺序,要求通过单个剪贴板对段落剪切粘贴,使得顺序为最小排列。单次剪切可以剪切一个段落或多个连续段落。因为只有一个剪贴板,所以在一次粘贴操作前不能连续剪切两次。 输入不超过 20 个测试样例,每个样例有两行:第一行是一个整数 n ,接下来 1 行有 n 个数,它们均落在离散闭区间 [1, n] 内。用空格分隔两...

COFACTOR 271

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

迭代加深 & IDE*

首先,它是深度优先搜索,其次它与普通深度优先搜索不同的是,每次深搜都会有搜索的最大深度限制,如果没有找到解,那么就增大深度,再进行深搜,如此循环直到找到解为止,这样可以找到最浅层的解。while(!IDA*,即基于迭代加深的A*算法IDA*实质上就是对迭代加深加了一个启发式的剪枝。

jyyyyx的算法之旅 1197

迭代加深、IDDFS解决埃及分数问题

http://blog.youkuaiyun.com/u014800748/article/details/47376435 迭代加深搜索(IDDFS)的思想 迭代加深搜索一般用来求解状态树“非常深”,甚至深度可能趋于无穷,但是“目标状态浅”的问题。如果用普通的DFS去求解,往往效率不够高。此时我们可以对DFS进行一些改进。最直观的一种办法是增加一个搜索的最大深度限制maxd,一般是从1开始。

zhangxian___的博客 591

《经典图论算法》迭代深化深度优先搜索(IDDFS)

摘要:1,迭代加深搜索的介绍2,迭代加深搜索的解题步骤3,迭代加深搜索优缺点4,迭代加深搜索解埃及分数1,迭代加深搜索的介绍迭代深化深度优先搜索(iterative deepening depth-first search,简称 IDS 或 IDDFS)又称迭代加深搜索,是一种用于解决搜索问题的算法框架,它结合了深度优先搜索(DFS)和广度优先搜索(BFS)的特点,通过限制搜索深度来避免无限循环,...

数据结构和算法 906

Loj10022 埃及分数(迭代加深搜索IDDFS)

#include<cstdio> #include<cmath> #include<cstring> using namespace std; typedef long long ll; ll depth,a,b,flag,ans[100005],nans[100005]; inline ll gcd(ll a,ll b){ return b?gcd(b,a...

weixin_33836223的博客 238
上一篇: 上下界网络流
下一篇: poj1167 The Buses
Modestr-E·X·L
博客等级 码龄7年 5粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值