洛谷同步链接

题目传送门(洛谷) 题目传送门(UVA)

前置知识:迭代加深搜索

定义

迭代加深是一种 每次限制搜索深度的 深度优先搜索。——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的更多相关文章

  1. 1443:【例题4】Addition Chains

    1443:[例题4]Addition Chains 题解 注释在代码里 注意优化搜索顺序以及最优化剪枝 代码 #include<iostream> #include<cstdio&g ...

  2. UVA 529 Addition Chains(迭代搜索)

      Addition Chains  An addition chain for n is an integer sequence  with the following four propertie ...

  3. [POJ2248] Addition Chains 迭代加深搜索

    Addition Chains Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5454   Accepted: 2923   ...

  4. poj 2248 Addition Chains (迭代加深搜索)

    [题目描述] An addition chain for n is an integer sequence with the following four properties: a0 = 1 am ...

  5. 「一本通 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\). 数列中的一 ...

  6. ZOJ1937:Addition Chains——题解

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1937 题目大意:创造一个数列,使得它: 1.单调不递减. 2.其中一个元素 ...

  7. 一本通【例题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 ...

  8. [POJ 2248]Addition Chains

    Description An addition chain for n is an integer sequence with the following four properties: a0 = ...

  9. UVA 529 - Addition Chains,迭代加深搜索+剪枝

    Description An addition chain for n is an integer sequence  with the following four properties: a0 = ...

  10. Addition Chains POJ - 2248 (bfs / dfs / 迭代加深)

    An addition chain for n is an integer sequence <a0, a1,a2,...,am=""> with the follow ...

随机推荐

  1. Linux限制可通过SSH登录到服务器的IP——hosts.allow

    Linux服务器针对固定的IP进行禁止.允许登录 linux 服务器通过设置/etc/hosts.allow和/etc/hosts.deny这个两个文件进行限制. 优先级:hosts.allow大于h ...

  2. K8s新手系列之ConfigMap资源

    概述 在 Kubernetes(K8s)中,ConfigMap 是一种 API 对象,用于将非机密性的数据保存到键值对中.Pod 可以将其用作环境变量.命令行参数或者存储卷中的配置文件. Config ...

  3. redis 中文乱码

    查询数据时中文乱码 解决方法: 使用 ./redis-cli 登录的时候加上 --raw参数 ./redis-cli --raw

  4. C++可重入函数和不可重入函数

    转载:https://blog.csdn.net/weixin_41969690/article/details/108006834 C++可重入函数和不可重入函数 可重入函数是指能够被多个线程&qu ...

  5. 网络编程:select

    原理:参考:https://my.oschina.net/fileoptions/blog/911091 select中内核函数有哪些 源码实现: #undef __NFDBITS #define _ ...

  6. 市盈率指标EP在A股市场的分析

    因子经济金融特性 EP因子即市盈率因子,常被投资者使用的几个估值因子之一.一般使用PE,即Price to Earning, 维基百科上的解释:市盈率指每股市价除以每股盈利(Earning Per S ...

  7. tkela二次开发之lay文件解析

    在tekla的一些配置文件中绝大都是本文格式存储的,如.dim:.ad:.vi;.tpl等文件:但是其中.lay文件却是一个例外:这个文件用txt开打时里面是会有乱码的. 我们知道这个文件是在软件的界 ...

  8. 基于CentOS Stream 8的物联网数据采集与展示方案

    系统架构全景图 图表 一.系统平台优化(CentOS Stream 8) 1. 系统基础配置 bash # 1. 系统更新与加固 sudo dnf update -y sudo dnf install ...

  9. k8s pod command使用

    简单说明 我们启pod服务时,有时需要在服务启动前做一些初始化的工作,这里可能会涉及多个shell命令以及判断执行,这里可以参考下面的步骤进行: command: ["/bin/bash&q ...

  10. 鸿蒙Next仓颉语言开发实战教程:订单详情

    幽蓝君听说HarmonyOS 5.1版本即将推送,6.0版本也快要来了,表示十分期待. 今天继续分享仓颉语言开发商城应用的实战教程,今天要分享的是订单详情页: 我们今天应该是第一次遇到分为上中下三部分 ...