题解:Addition Chains
前置知识:迭代加深搜索
定义
迭代加深是一种 每次限制搜索深度的 深度优先搜索。——OI Wiki
简单而言,就是一种限制搜索深度的DFS。有什么变化??
过程
设搜索深度上限为 $h$,搜索深度为 $p$ 。
那么 $h$ 从 $1$ 开始自增,并在每次自增前进行DFS。(形如 dfs(p,h,...)
)
当DFS函数内部检测到 $p\ge h$ 时,便结束递归,无论是否已经找到答案。
当所有递归结束后,如果找到了答案,那自然是最好的;否则使得 $h\leftarrow h+1$ 后再次调用DFS从 $p=1$ 开始递归,直至找到答案。
DFS实现的BFS?
当搜索树的分支比较多时,每增加一层的搜索复杂度会出现指数级爆炸式增长,这时前面重复进行的部分所带来的复杂度几乎可以忽略,这也就是为什么迭代加深是可以近似看成 BFS 的。
也可以这么说。
但是需要注意的是,迭代加深搜索与广度优先搜索的思想完全不一样,这么说仅仅是因为上述原因。
为什么不使用BFS?
因为BFS会 $\text{MLE}$。
正解:迭代加深搜索+剪枝
每次限制序列长度 $m$ ,当 $dfs(p,h)$ 满足 $p>h$ 时,判断 $a_m$ 是否等于 $n$ 即可。
但需要注意的是,迭代加深搜索仍然摆脱不了搜索指数级的时间复杂度。因此,考虑剪枝。
限制搜索深度,这没什么好说的。
考虑到,假设第 $i$ 项为 $a_i$,那么 $a_{i+1}$ 最大为 $a_i+a_i=2\times a_i$,$a_{i+2}$ 最大为 $a_{i+1}+a_{i+1}=2\times a_{i+1}=4\times a_{i}$,一直到 $a_m$ 最大为 $2^{m-i}\times a_{i}$。
那么当我们在 $dfs(p,h)$ 枚举 $a_p$ 时,便可以加上剪枝:
if((a[p]<<(h-p))<n)return;
枚举 $i,j<p$,使得 $a_p=a_i+a_j$,为了使得 $a_m$ 快速达到 $n$,我们从大到小遍历。即:$i$ 从 $p-1$ 到 $1$ 遍历,$j$ 从 $i$ 到 $1$ 遍历。
然后,需要特判 $n=0$ 和 $n=1$,$m$ 遍历 $2\sim n$。$m=n$ 时一定有解,因为那种情况就是对于整数 $i\in[2,n]$,满足 $a_i=a_{i-1}+1$。
AC代码
//#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<iomanip>
#include<cstdio>
#include<string>
#include<vector>
#include<cmath>
#include<ctime>
#include<deque>
#include<queue>
#include<stack>
#include<list>
using namespace std;
const int N=10000;
bool flag;
int n,a[N+1]={0,1};//a[1]=1
void dfs(int p,int h){
if(p>h){
if(a[h]==n)flag=true;
return;
}
for(int i=p-1;i>=1;i--){
for(int j=i;j>=1;j--){
a[p]=a[i]+a[j];
if((a[p]<<(h-p))<n)return;//位运算,常数优化
dfs(p+1,h);
if(flag)return;
}
}
}
int main(){
/*freopen("test.in","r",stdin);
freopen("test.out","w",stdout);*/
while(true){
scanf("%d",&n);
if(n==0)return 0;
if(n==1){
printf("1\n");
continue;
}
for(int m=2;m<=n;m++){
flag=false;
dfs(2,m);
if(flag){
for(int j=1;j<i;j++)printf("%d ",a[j]);
printf("%d",a[i]);
putchar(10);
break;
}
}
}
/*fclose(stdin);
fclose(stdout);*/
return 0;
}
题解:Addition Chains的更多相关文章
- 1443:【例题4】Addition Chains
1443:[例题4]Addition Chains 题解 注释在代码里 注意优化搜索顺序以及最优化剪枝 代码 #include<iostream> #include<cstdio&g ...
- UVA 529 Addition Chains(迭代搜索)
Addition Chains An addition chain for n is an integer sequence with the following four propertie ...
- [POJ2248] Addition Chains 迭代加深搜索
Addition Chains Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5454 Accepted: 2923 ...
- poj 2248 Addition Chains (迭代加深搜索)
[题目描述] An addition chain for n is an integer sequence with the following four properties: a0 = 1 am ...
- 「一本通 1.3 例 4」Addition Chains
Addition Chains 题面 对于一个数列 \(a_1,a_2 \dots a_{m-1},a_m\) 且 \(a_1<a_2 \dots a_{m-1}<a_m\). 数列中的一 ...
- ZOJ1937:Addition Chains——题解
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1937 题目大意:创造一个数列,使得它: 1.单调不递减. 2.其中一个元素 ...
- 一本通【例题4】Addition Chains——题解
又是一道剪枝剪了半天的搜索题...题目传送 要充分利用题目中的约束条件:1.:2.对于每个k(1≤k≤m)k(1≤k≤m)满足ak=ai+aj(0≤i,j≤k−1)ak=ai+aj(0≤i,j≤k−1 ...
- [POJ 2248]Addition Chains
Description An addition chain for n is an integer sequence with the following four properties: a0 = ...
- UVA 529 - Addition Chains,迭代加深搜索+剪枝
Description An addition chain for n is an integer sequence with the following four properties: a0 = ...
- Addition Chains POJ - 2248 (bfs / dfs / 迭代加深)
An addition chain for n is an integer sequence <a0, a1,a2,...,am=""> with the follow ...
随机推荐
- CTFHub技能树RCE命令注入
1.命令注入 // 关键代码 <?php $res = FALSE; if (isset($_GET['ip']) && $_GET['ip']) {// 传入ip, $cmd ...
- windows下安装maven环境(windows10)
1.下载maven https://archive.apache.org/dist/maven/maven-3/ 2.安装配置 1.解压后新建本地仓库 2.编辑apache-maven-3.0.5-b ...
- UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe8 in position...解决方法
运行python程序,出现了以下错误: File "C:/��/python ѧϰ/god_mellonѧϰpython/untitled2/fofa_py2.py", line ...
- Android frida hook (学习分享)
frida模块 参考: https://www.52pojie.cn/thread-1823118-1-1.html https://www.52pojie.cn/thread-1840174-1-1 ...
- 信息资源管理综合题之“LJ集团信息化项目规划问题”
一.LJ集团是北京的一家规模巨大的房地产投资公司,早在15年前,该公司出现了如下几个问题:每个业务员手上的用户资料,其他人无法得知,从而导致员工离职时会流失大量潜在客户:业务员繁忙的时候,无法满足客户 ...
- FHQ treap(无旋treap)
平衡树 平衡树作为一种中级数据结构,有着广泛的使用场景.其平衡性的维护方式灵活多变,而其中的无旋treap更以简单著称 P3369 [模板]普通平衡树 题意: 需维护以下操作: 插入一个数 x. 删除 ...
- Django实例(3)-用户连数据库登入系统
App01--->urls.py from django.contrib import adminfrom django.conf.urls import urlfrom app01 impor ...
- 操作系统 :AArch64体系--ARM最新编程架构模型剖析
本节来讲讲 ARM 的 AArch64 体系结构,扩展一下视野. 看看什么是 AArch64 体系,然后分析一下 AArch64 体系有什么特点,最后了解一下 AArch64 体系下运行程序的基础,包 ...
- ES查询优化随记1: 多路向量查询 & KNN IO排查 & 高效Filter使用
哈哈最近感觉自己不像算法倒像是DB,整天围着ES打转,今天查IO,明天查内存,一会优化查询,一会优化吞吐.毕竟RAG离不开知识库,我们的选型是ES,于是这一年都是和ES的各种纠葛.所以顺手把近期获得的 ...
- theZoo - 恶意软件分析资源库
theZoo 是一个恶意软件分析资源库,收集了几乎所有版本的恶意软件包括(恶意软件源代码项目.二进制恶意软件程序).需要分析病毒.恶意软件的朋友可以在项目中下载某个恶意软件来分析. 功能特性 恶意软件 ...