UVA529 加成序列
传送门
题目分析
一道 dfs,迭代加深
我们可以很快的猜出来最终 \(m\) 的长度必然是小于 \(10\) 的。
而这种浅深度的问题正好适用于迭代加深。
之后考虑剪枝
优化搜索顺序 : 我们要让序列中的数字迅速地逼近 \(n\),自然是要 \(i\) 和 \(j\) 从大到小枚举,且 \(j<=i\)、
排除等效冗余 : 我们发现,对于不同的 \(i\) 和 \(j\) ,他们的 \(a[i]+a[j]\) 有一定的可能性会相同
所以避免重复搜索,我们需要进行判重.
好了,到这里你就可以轻松切掉《算法竞赛进阶指南》那个题了///
但是在 UVA 中,\(n\) 的数据范围可是 \(1e5\) 啊!
所以还有一个剪枝,
最优化剪枝 :后面每一项最多是前一项的 \(2\) 倍
代码实现
#include <bits/stdc++.h>
#define rint register int
#define endl '\n'
using namespace std;
const int N = 1e4 + 5;
int n, path[N];
bool dfs(int u, int k)
// u is the depth of now
// k is the depth of MAX
{
if (path[u - 1] > n)
{
return false;
}
if (u == k)
{
return path[u - 1] == n;
}
if (path[u - 1] * ((long long)1 << (k - u)) < n)//最优化剪枝
{
return false;
}
bool st[N] = {0};//通过 bool数组排除等效冗余
for (rint i = u - 1; i >= 0; i--)
{
for (rint j = i; j >= 0; j--)//搜索顺序
{
int s = path[i] + path[j];
if (s > n || s <= path[u - 1] || st[s])
{
continue;
}
st[s] = true;
path[u] = s;
if (dfs(u + 1, k))
{
return true;
}
}
}
return false;
}
signed main()
{
path[0] = 1;
while (cin >> n and n != 0)
{
int depth = 1;
while (!dfs(1, depth))// 不断扩大范围
{
depth++;
}
for (rint i = 0; i < depth - 1; i++)
{
cout << path[i] << " ";
}
cout << path[depth - 1];//UVA 输出不能有多余空格
puts("");
}
return 0;
}
UVA529 加成序列的更多相关文章
- POJ2248-Addition Chains
满足如下条件的序列被称为加成序列: X[1]=1,X[m]=n,X[1]<X[2]<......<X[m-1]<X[n] 对于每个k(2<=k<=m)都存在两个整数 ...
- Addition Chains
题目描述: 一个与 n 有关的整数加成序列 < a0 , a1 , a2 ...am> 满足一下四个条件: 1.a0=1 2.am=n 3.a0<a1<a2<...< ...
- 【夯实PHP基础】UML序列图总结
原文地址 序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色 ...
- Windows10-UWP中设备序列显示不同XAML的三种方式[3]
阅读目录: 概述 DeviceFamily-Type文件夹 DeviceFamily-Type扩展 InitializeComponent重载 结论 概述 Windows10-UWP(Universa ...
- 软件工程里的UML序列图的概念和总结
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 软件工程的一般开发过程:愿景分析.业务建模,需求分析,健壮性设计,关键设计,最终设计,实现…… 时序图也叫序列图(交互图),属于软件 ...
- python序列,字典备忘
初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...
- BZOJ 1251: 序列终结者 [splay]
1251: 序列终结者 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 3778 Solved: 1583[Submit][Status][Discu ...
- 最长不下降序列nlogn算法
显然n方算法在比赛中是没有什么用的(不会这么容易就过的),所以nlogn的算法尤为重要. 分析: 开2个数组,一个a记原数,f[k]表示长度为f的不下降子序列末尾元素的最小值,tot表示当前已知的最长 ...
- [LeetCode] Sequence Reconstruction 序列重建
Check whether the original sequence org can be uniquely reconstructed from the sequences in seqs. Th ...
- [LeetCode] Binary Tree Longest Consecutive Sequence 二叉树最长连续序列
Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...
随机推荐
- javascript中一些难以理解的专有名词 1(也不是很专有)
变量提升 变量提升:是指js代码执行过程中,js引擎把变量的声明和函数的声明提升到代码的开头的"行为". 变量和函数在代码里的位置是不会变的,而是在编译阶段被js引擎放入内存中. ...
- Avalonia项目在OpenKylin运行踩坑
Avalonia项目在OpenKylin运行踩坑 本篇博客记录OpenKylin开源操作系统中运行Avalonia项目遇到的各种问题,会一直更新,最新的内容请点击文末的链接跳转到我的博客原文地址查看. ...
- 快速了解DevSecOps:构建安全软件开发的基石!
关键词 DevSecOps - 在不影响敏捷性的前提下,将安全充分融入到SDLC的所有环节中 SDLC-软件交付生命周期 SCA-软件组成分析-用于识别和检测软件中使用的开源/第三方组件的已知安全漏洞 ...
- MySQL5.5+配置主从同步并结合ThinkPHP5设置分布式数据库
前言: 本文章是在同处局域网内的两台windows电脑,且MySQL是5.5以上版本下进行的一主多从同步配置,并且使用的是集成环境工具PHPStudy为例.最后就是ThinkPHP5的分布式的连接,读 ...
- 一次Java内存占用高的排查案例,解释了我对内存问题的所有疑问
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明. 问题现象 7月25号,我们一服务的内存占用较高,约13G,容器总内存16G,占用约85%,触发了内存报警(阈值8 ...
- VulnStack - ATT&CK红队评估实战(一) Writeup
VulnStack - ATT&CK红队评估实战(一) Writeup VulnStack(一)环境搭建 项目地址 http://vulnstack.qiyuanxuetang.net/vul ...
- 搭建Minio分布式服务
本文主要介绍Minio的分布式环境搭建,安装比较简单,因博主只有一台window,所以使用VM虚拟机搭建的. 搭建前可以先了解下minio: 1.官方文档:https://docs.min.io/cn ...
- 如何创建集成 LSP 支持多语言的 Web 代码编辑器
对于一个云开发平台来说,一个好的 Web IDE 能很大程度地提高用户的编码体验,而一个 Web IDE 的一个重要组成部分就是代码编辑器. 目前有着多款 web 上的代码编辑器可供选择,比如 Ace ...
- Kafka与RabbitMQ
一.什么是kafka,什么是rabbit Kafka是由Scala语言开发的一种分布式流处理框架,主要用于处理活跃的流式数据,以及大数据量的数据处理.它采用发布-订阅模型,支持消息的批量处理,数据 ...
- 在 Net7.0环境下通过反射创建泛型实例和调用泛型方法
一.介绍 最近没事干,就用闲暇时间写点东西,也记录一下温习历程.老人说的好,好记性,不如烂笔头.时间一长,当时记忆的再清楚,都会变得模糊,索性就写博客记录下来,如果下次需要,直接打开博客就找到了,不用 ...