传送门

题目分析

一道 dfs,迭代加深

我们可以很快的猜出来最终 \(m\) 的长度必然是小于 \(10\) 的。

而这种浅深度的问题正好适用于迭代加深。

之后考虑剪枝

优化搜索顺序 : 我们要让序列中的数字迅速地逼近 \(n\),自然是要 \(i\) 和 \(j\) 从大到小枚举,且 \(j<=i\)、

排除等效冗余 : 我们发现,对于不同的 \(i\) 和 \(j\) ,他们的 \(a[i]+a[j]\) 有一定的可能性会相同

所以避免重复搜索,我们需要进行判重.

好了,到这里你就可以轻松切掉《算法竞赛进阶指南》那个题了///

AcWing 170

但是在 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 加成序列的更多相关文章

  1. POJ2248-Addition Chains

    满足如下条件的序列被称为加成序列: X[1]=1,X[m]=n,X[1]<X[2]<......<X[m-1]<X[n] 对于每个k(2<=k<=m)都存在两个整数 ...

  2. Addition Chains

    题目描述: 一个与 n 有关的整数加成序列 < a0 , a1 , a2 ...am> 满足一下四个条件: 1.a0=1 2.am=n 3.a0<a1<a2<...< ...

  3. 【夯实PHP基础】UML序列图总结

    原文地址 序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色 ...

  4. Windows10-UWP中设备序列显示不同XAML的三种方式[3]

    阅读目录: 概述 DeviceFamily-Type文件夹 DeviceFamily-Type扩展 InitializeComponent重载 结论 概述 Windows10-UWP(Universa ...

  5. 软件工程里的UML序列图的概念和总结

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 软件工程的一般开发过程:愿景分析.业务建模,需求分析,健壮性设计,关键设计,最终设计,实现…… 时序图也叫序列图(交互图),属于软件 ...

  6. python序列,字典备忘

    初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...

  7. BZOJ 1251: 序列终结者 [splay]

    1251: 序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3778  Solved: 1583[Submit][Status][Discu ...

  8. 最长不下降序列nlogn算法

    显然n方算法在比赛中是没有什么用的(不会这么容易就过的),所以nlogn的算法尤为重要. 分析: 开2个数组,一个a记原数,f[k]表示长度为f的不下降子序列末尾元素的最小值,tot表示当前已知的最长 ...

  9. [LeetCode] Sequence Reconstruction 序列重建

    Check whether the original sequence org can be uniquely reconstructed from the sequences in seqs. Th ...

  10. [LeetCode] Binary Tree Longest Consecutive Sequence 二叉树最长连续序列

    Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...

随机推荐

  1. 自用 .net C# CSV文件写入读取工具类

    using System.Data; using System.IO; using System.Linq; using System.Text; using System.Text.RegularE ...

  2. 彻底搞懂Vue针对数组和双向绑定(MVVM)的处理方式

    欢迎关注我的博客:https://github.com/wangweianger/myblog Vue内部实现了一组观察数组的变异方法,例如:push(),pop(),shift()等. Object ...

  3. 青少年CTF平台-Web-PingME

    题目描述 题目难度一颗星,五十分. 解题记录 进入题目中,发现这是一个ping功能 我们用连字符||进行分割两个语句,保证同时运行且输出. Payload为127.0.0.1 || ls 发现有fla ...

  4. 基于 LLM 的知识图谱另类实践

    本文整理自社区用户陈卓见在「夜谈 LLM」主题分享上的演讲,主要包括以下内容: 利用大模型构建知识图谱 利用大模型操作结构化数据 利用大模型使用工具 利用大模型构建知识图谱 上图是之前,我基于大语言模 ...

  5. iframe子窗口调用父窗口方法

    //一个iframe页面调用另一个iframe页面的方法self.parent.frames["sort_bottom"].mapp($("#id").val( ...

  6. 文心一言 VS 讯飞星火 VS chatgpt (88)-- 算法导论8.3 1题

    一.用go语言,参照图 8-3 的方法,说明 RADIX-SORT在下列英文单词上的操作过程:COW,DOG,SEA,RUG,ROW,MOB, BOX, TAB, BAR, EAR,TAR, DIG, ...

  7. 关于TCP 四次挥手过程中的reset包问题

    数据包过程 TCP状态机转换过程 客户端在接受到第32个数据包之后,应该发送1个对FIN的ACK数据包,然而客户端缺直接连续发送了3个Rest数据包36~38,客户端并未进入time wait阶段,直 ...

  8. Springboot简单功能示例-3 实现基本登录验证

    springboot-sample 介绍 springboot简单示例 跳转到发行版 查看发行版说明 软件架构(当前发行版使用) springboot hutool-all 非常好的常用java工具库 ...

  9. 多数据源管理:掌握@DS注解的威力

    大家在日常后端开发过程,不可避免的会接触到需要用到配置多个数据源的场景,在这里,小编介绍一种简单方便的,只需要简单的配置和一个@DS注解就能实现动态数据源的方式,这种动态数据源底层原理是基于Mybat ...

  10. 其它——python操作kafka实践

    文章目录 1.先看最简单的场景,生产者生产消息,消费者接收消息,下面是生产者的简单代码. ------------------------------------------------------- ...