目录

算法核心概念及思想

算法的产生

概念

拯救时间的函数

例题:《加法链》


如题,由于此文章只讲“迭代加深”,所以请先了解what “深度优先搜索” is。

算法核心概念及思想

算法的产生

如下一棵搜索树,它的最优解(符合要求且深度最小)在A2位置:

如果m、n都是大于的数,那么使用深度优先搜索的话会在A1的子树下遍历超时,广度优先搜索会在存A1~An时耗掉过多空间。

既然要求深度最小的可行解,那么不妨每次用深度优先搜索搜深度≤k的节点,把k逐次增加,这样既可以最早搜到A2(判断A2可行后就直接返回了),又不会耗过多空间。于是,迭代加深搜索应运而生。

概念

迭代加深(Iterative deepening)搜索,实质上就是限定下界的深度优先搜索。即首先允许深度优先搜索K层搜索树,若没有发现可行解,再将K+1后重复以上步骤搜索,直到搜索到可行解。

迭代加深搜索的算法中,连续的深度优先搜索被引入,每一个深度约束逐次加1,直到搜索到目标为止。

迭代加深搜索算法就是仿广度优先搜索的深度优先搜索。既能满足深度优先搜索的线性存储要求,又能保证发现一个最小深度的目标结点。

从实际应用来看,迭代加深搜索的效果比较好,并不比广度优先搜索慢很多,但是空间复杂度却与深度优先搜索相同,比广度优先搜索小很多,在一些层次遍历的题目中,迭代加深不失为一种好方法!

——来自某个专业的PPT

拯救时间的函数

由于迭代加深搜索是反复地使用深搜,要是深搜不剪枝的话会导致时间爆炸,所以根据迭代加深限定下界的特点,出现了乐观估计函数

乐观估计函数是在迭代加深中的剪枝,其作用就是判断当前的搜索节点有无可能在限定下界中找出解。比如其中一种是估计当前要找到最优解最少需要多少步,如果当前深度加上这个步数大于了限定的下界,那么只好强制退出——等再一次扩宽下界时再搜这里。

例题:《加法链》

时间限制: 2秒      内存限制: 65536 KB

n的加法链是整数序列<a0,a1,a2,...,am>,具有以下四个属性:

  • a0 = 1
  • am = n
  • a0 <a1 <a2 <... <am-1 <am
  • 对于每个k(1 <= k <= m),存在两个(不一定是不同的)整数i和j(0 <= i,j <= k-1),其中ak = ai + aj

你得到一个整数n。你的工作是为n构建一个最小长度的附加链。如果存在多个这样的序列,则任何一个都是可接受的。

例如,当要求输入5的加法链时,<1,2,3,5>和<1,2,4,5>都是有效的解决方案。

输入

输入将包含一个或多个测试用例。每个测试用例由一行包含一个整数n(1 <= n <= 100)组成。对于n,输入以零(0)的值终止。

输出

对于每个测试用例,打印一行包含所需的整数序列。将数字分隔一个空格。

样本输入



12 
15 
77 
0

样本输出

1 2 4 5 
1 2 4 6 7 
1 2 4 8 12 
1 2 4 5 10 15 
1 2 4 8 9 17 34 68 77


通过贪心的策略得知:   ∵(0≤i,j<k)

所以让a每一项等于前一项的两倍,可以使数列增长最快。如果这样一个数列的第m项刚好大于等于n,那么可行解的长度一定大于等于m,否则不可能得到n。于是可以把下界从m开始加起,每次DFS搜一遍,最先搜出的一定最优。

此题的乐观估计函数也可以用这个数列来推断:从搜到的数出发,以增长最快的方式乘2一直推到下界位置,如果都小于n,那么此路继续搜下去一定无法在限界内得到n,就返回。

坑点:每次枚举前面的项时要倒着枚举。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,k,l,a[105];
bool f;
void iddfs(int x){//迭代加深if(x>l){//控制搜索深度if(a[x-1]==n)f=1;return;}for(int i=x-1;i>0;i--){for(int j=i;j>0;j--){if(a[i]+a[j]>a[x-1]&&a[i]+a[j]<=n&&!f){//枚举前面两个数相加a[x]=a[i]+a[j];int s=a[x];s<<=(l-x);if(s<n)continue;//乐观估计iddfs(x+1);}}}
}
int main()
{scanf("%d",&n);while(n){int s=1;l=1;f=0;a[1]=1;while(s<n)s<<=1,l++;for(;!f;l++)//扩宽下界iddfs(2);/由于a1必为1,所以从a2搜起for(int i=1;i<l;i++){if(i-1)putchar(' ');printf("%d",a[i]);}putchar('\n');scanf("%d",&n);}return 0;
}

浅谈*迭代加深*深度优先搜索相关推荐

  1. [AI]深度优先、广度优先、迭代加深搜索练习题

    一. 请分别用广度优先,深度优先,迭代加深搜索按顺序写出其访问和扩展的节点: 1. 广度优先搜索: Visit{A, B, C, D, E, F, G, H, I, J} Expansion{A, B ...

  2. 人工智能学习:python实现迭代加深的深度优先搜索

    人工智能学习:python实现深度优先搜索算法 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN10 python版本:3.5 开发 ...

  3. 不撞南墙不回头——浅谈深度优先搜索(DFS)

    先看看维基百科: 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法.这个算法会尽可能深的搜索树的分支.当节点v的所在边都己被探寻过,搜索将回溯到发 ...

  4. 浅谈 深度优先搜索与广度优先搜索

    文章目录 深度优先搜索(DFS) 广度优先搜索(BFS) 区别 DFS例题:八皇后问题 AC代码 思路整理 BFS例题:奇怪的电梯 AC代码 思路整理 深度优先搜索(DFS) 深搜在无减枝的情况下,一 ...

  5. POJ2248 Addition Chains(迭代加深搜索)

    题目链接: poj2248 题目大意 给你一个数字n,你需要构造一个首项为1,末项为n的递增序列,并且这个序列的非首项的数字都能从它前面找到两项之和与之相等,前面的两项可以为同一项,即可重复,并且要让 ...

  6. 迭代加深搜索与埃及分数求解

    迭代加深搜索,实质上是限定下界的深度优先搜索.即首先允许深度优先搜索K层,若没有发现可行解,再将K+1后 重复以上步骤搜索,直到搜索到可行解. 在迭代加深搜索的算法中,连续的深度优先搜索被引入,每一个 ...

  7. 算法复习——迭代加深搜索(骑士精神bzoj1085)

    题目: Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标 ...

  8. C++迭代加深搜索及其例题讲解—————Addition Chains

    前言: 学习算法时,一个关键的问题是什么时候来使用它.在一些搜索问题中,使用普通的DFS可能会让你把时间浪费在深度非常大而且答案不是最优的搜索过程上,甚至有的时候DFS搜索的深度是无穷的,而BFS虽说 ...

  9. 区别:迭代加深搜索广度优先搜索

    我之前始终不明白,迭代加深的深度优先搜索和宽度优先搜索有什么区别. 路径不同 搜索问题的解,不单单是那个点的位置.数值,还包括从根节点到达目标节点所经过的路径. 虽然在初次求解的时候,迭代加深的计算步 ...

最新文章

  1. php偶尔500,python – 偶尔500错误
  2. 计算机二级怎么更改报名密码忘记了怎么办,中考报名系统密码忘了怎么办
  3. ida 反编译 linux bin,使用IDA pro逆向ARM M系核心的Bin固件
  4. java com dll_通过COM组件方式实现java调用C#写的DLL文件
  5. 大一python基础编程试卷_2020大学慕课Python编程基础试题及答案
  6. peterson算法p0流程图_Dekker算法与Peterson算法
  7. 关于TCP报文段以及拥塞窗口cwnd的理解纠正
  8. 整理一些计算机基础知识!
  9. c mysql对时间加减_25.2.10. 日期和时间值的C API处理
  10. 存在out参数的webservices_Sentaurus Device材料参数的那些事
  11. (最完美)红米Note 5A的usb调试模式在哪里打开的步骤
  12. C语言——输入两个正整数m和n,求其最大公约数和最小公倍数。
  13. APP开发的七大阶段,你了解多少?
  14. Python——数学运算函数
  15. java初级中级高级区分_初级、中级、高级程序员之间的区别,最后的顶级程序员很秀...
  16. 图的有权最短路径及Dijkstra算法
  17. 读《七周七语言》,感悟其魂
  18. 15.9 文本查询程序再探(继承)
  19. Windows2016 L2TP配置(预共享密钥模式)
  20. Android内置系统apk问题

热门文章

  1. android 开发者模式 手机变慢,安卓手机速度变慢怎么办,教你一招手机速度立马恢复顺畅...
  2. 利用Python获取某游戏网站热销商品并用pands进行Excel数据存储
  3. The 15th Jilin Provincial Collegiate Programming Contest
  4. Crx搜搜 - 一个牛X的扩展商店
  5. 开店没有客流量怎么办?二狗子告诉你
  6. 高德地图加载多个围栏、行政区查询方法
  7. 我的物联网项目(十八) 城市合伙人战略
  8. 软件开发搞定计算机组成原理:计算篇
  9. ArcGIS 栅格计算器 Con用法
  10. HTML综合之实现耀炎食品有限公司网页