POJ - 2248 Addition Chains(dfs+迭代加深)
题目链接:点击查看
题目大意:我们规定加法链有如下特点:
现在给出一个数n,求该数的最短加法链
题目分析:这个题首先我们可以枚举所有可能性,并且进行适当的剪枝:
- 当前长度大于等于最优解时回溯
- 当前值等于n时,更新最优解
- 当前值大于n时,直接回溯
- 为了使整个序列尽快逼近n,我们可以从大到小枚举
当然经过分析大我们可以发现,这个题目的m最大在10左右
再经过分析我们可以得知,每次加和构成新的一个数,都必须有最后一个数字的参与,不然的话肯定不是最优解,这样我们就能将每次dfs时n*n的复杂度下降到了n
这里我再挂一下迭代加深的定义和思想:(摘自zx学长的ppt)
深度优先搜索每次选定一个分支,不断深入,直至到达递归边界才回溯。这种策略带有一定的缺陷。
搜索树的每个节点的分支数目非常多,并且问题的答案在某个较浅的节点上。如果一开始就搜索错了分支,就很可能在不包含答案的深层子树上浪费很多时间。
我们可以从小到大限制搜索深度,如果在当前深度限制下搜不到答案,就把深度限制增加,重新进行一次搜索。
虽然该过程在深度限制为d时,会重复搜索第1--d-1层的节点,但是当搜索树节点分支数目较多时,随着层数的深入,每层节点会呈指数级增长,这点重复的搜索的节点与深层子树的规模相比,实在是小巫见大巫了。
当搜索树的规模随着层次的深入增长很快,并且我们能够确保答案在一个较浅的层次时,可以迭代加深。
说到这里,我们就可以利用迭代加深的思想每层搜索这个题目的答案了
代码:
#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=20;int n;int deep;//搜索树的深度int a[N];bool dfs(int cnt)
{if(cnt>deep)//当前深度搜索结束{if(a[deep]==n)//若找到答案,返回truereturn true;return false;}for(int i=cnt-1;i>=1;i--)//从大到小枚举,可以保证不重不漏{a[cnt]=a[cnt-1]+a[i];if(a[cnt]>n)continue;if(dfs(cnt+1))return true;}return false;
}int main()
{
// freopen("input.txt","r",stdin);a[1]=1;//直接设置好第一个数while(scanf("%d",&n)!=EOF&&n){if(n==1)//对1特判一下printf("1\n");else{deep=1;//初始化深度为第一层while(1){deep++;if(dfs(2))//每次从第二层开始搜索,搜到第deep层结束{printf("1");for(int i=2;i<=deep;i++)printf(" %d",a[i]);printf("\n");break;}} } }return 0;
}
POJ - 2248 Addition Chains(dfs+迭代加深)相关推荐
- 【poj2248】 Addition Chains(迭代加深)
题目链接:http://poj.org/problem?id=2248 分析 当搜索树的分支随深度增大得很快的时候,最适合用迭代加深. 设置一个dep限制搜索深度,一旦到达dep立刻回溯. dep逐渐 ...
- POJ2248 Addition Chains(迭代加深搜索)
题目链接: poj2248 题目大意 给你一个数字n,你需要构造一个首项为1,末项为n的递增序列,并且这个序列的非首项的数字都能从它前面找到两项之和与之相等,前面的两项可以为同一项,即可重复,并且要让 ...
- POJ 2248 Addition Chains
这一道题目用的仍然是DFS的方法.准确的说应该是Iterative Deepening Search, 关键在于理解,我们要找到的是最小长度,那么对应过来就是最小的深度.同时,还要理解, 如果当前深度 ...
- Gym - 102460A Rush Hour Puzzle(dfs迭代加深)
题目链接:点击查看 题目大意:给出一个 6 * 6 的矩阵,表示华容道的游戏界面,现在需要红色汽车(标号为 1 )从第三行最右端到达出口的最短时间,如果无解或者步数超过 10 输出 -1 题目分析:因 ...
- 巴士(DFS迭代加深 + 剪枝)
原题链接: https://www.acwing.com/problem/content/188/ 题目描述 一名男子在12:00抵达了某巴士站,并且在12:00-12:59期间他将在那里逗留. 巴士 ...
- POJ 2245 Addition Chains(算竞进阶习题)
迭代加深dfs 每次控制序列的长度,依次加深搜索 有几个剪枝: 优化搜索顺序,从大往下枚举i, j这样能够让序列中的数尽快逼近n 对于不同i,j和可能是相等的,在枚举的时候用过的数肯定不会再被填上所以 ...
- 洛谷 P2534 [AHOI2012]铁盘整理(IDA*(dfs+迭代加深+估值函数))
题目链接:P2534 [AHOI2012]铁盘整理 题解:本篇为IDA*的应用,做这题前建议先做前一篇文章的题目:点这 这题中难在估值函数的确定,总的来说IDA*基本上格式都差不多,主要难在估值函数的 ...
- C++迭代加深搜索及其例题讲解—————Addition Chains
前言: 学习算法时,一个关键的问题是什么时候来使用它.在一些搜索问题中,使用普通的DFS可能会让你把时间浪费在深度非常大而且答案不是最优的搜索过程上,甚至有的时候DFS搜索的深度是无穷的,而BFS虽说 ...
- POJ 2248 算进 P110 Addition Chains
满足如下条件的序列X(序列中元素被标号为1.2.3-m)被称为"加成序列": 1.X[1]=1 2.X[m]=n 3.X[1]<X[2]<-<X[m-1]< ...
最新文章
- 在redhat9中交叉编译nano-X nxlib和fltk
- 636 起投资事件,吸金 574 亿
- 静态NAT技术三部曲
- Spring Cloud Zuul支持–配置超时
- 关于多线程中锁的理解
- mysql 删除了授权_mysql用户授权访问与删除授权
- realme GT2 Pro抢先开启盲售:史上屏幕最好高端旗舰
- C语言之一些值得被定义为常用C语言头文件库的漂亮宏定义
- 移动硬盘无法访问,要怎么找到文件
- python之路8-内置模块介绍
- 350网店模板一键安装模版与淘宝传统装修的对比
- 微盟致远OA聚水潭YonSuite系统对接集成整体解决方案
- excel的lookup函数
- 佳文分享:我个人比较受用的一些习惯
- nexus5 博通芯片WIFI详解 (2)
- 数据驱动的软件智能化开发| ChinaOSC
- 使用cmd命令向局域网中的某台电脑发送消息
- “元宇宙”,究竟离我们有多远?(中)
- QImage的深拷贝与浅拷贝
- 【MySQL 8.0 OCP 1Z0-908认证考试】 题库精讲--第二讲mysql主从
热门文章
- Gateway网关-网关作用介绍
- 手写自己的MyBatis框架-支持插件
- MyBatis 源码解读-loadCustomLogImpl(settings)
- AnnotationScopeMetadataResolver 解析作用域元数据
- 模拟spring IOC、源码分析
- 后台服务系统之Dubbo协议
- MySQL 1093 You can't specify target table for update in FROM c 的解决办法
- SpringBoot_配置-自动配置原理
- 纽约州立大学宾汉姆顿大学计算机科学,C同学喜获纽约州立大学宾汉姆顿大学硕士录取...
- 高级定时器/TIM1/TIM8 定时时间不准的问题/TIM_TimeBaseStructure.TIM_RepetitionCounter