每周一算法:迭代加深搜索

news2024/11/16 16:28:22

题目链接

加成序列

题目描述

满足如下条件的序列 X X X(序列中元素被标号为 1 、 2 、 3 … m 1、2、3…m 123m)被称为加成序列

  1. X [ 1 ] = 1 X[1]=1 X[1]=1
  2. X [ m ] = n X[m]=n X[m]=n
  3. X [ 1 ] < X [ 2 ] < … < X [ m − 1 ] < X [ m ] X[1]<X[2]<…<X[m−1]<X[m] X[1]<X[2]<<X[m1]<X[m]
  4. 对于每个 k k k 2 ≤ k ≤ m 2≤k≤m 2km)都存在两个整数 i i i j j j 1 ≤ i , j ≤ k − 1 1≤i,j≤k−1 1i,jk1 i i i j j j可以相等),使得 X [ k ] = X [ i ] + X [ j ] X[k]=X[i]+X[j] X[k]=X[i]+X[j]

你的任务是:给定一个整数 n n n,找出符合上述条件的长度 m m m最小的“加成序列”

如果有多个满足要求的答案,只需要找出任意一个可行解。

输入格式

输入包含多组测试用例。
每组测试用例占据一行,包含一个整数 n n n

当输入为单行的 0 0 0 时,表示输入结束。

输出格式

对于每个测试用例,输出一个满足需求的整数序列,数字之间用空格隔开。

每个输出占一行。

数据范围

1 ≤ n ≤ 100 1≤n≤100 1n100

输入样例

5
7
12
15
77
0

输出样例

1 2 4 5
1 2 4 6 7
1 2 4 8 12
1 2 4 5 10 15
1 2 4 8 9 17 34 68 77

算法思想

题目要求输出长度最小的加成序列,由于要输出序列,因此深度优先搜索是一个不错的选择。
深度优先搜索的基本思想是每次选定一个分支,不断深入,直至到达递归边界然后回溯。这种策略带有一定的缺陷,试想当搜索树每个节点的分支数目非常多,并且问题的答案在某个较浅的节点上,如果深搜一开始选错了分支,就很可能在不包含答案的深层子树上浪费很多时间。如下图所示:
在这里插入图片描述
上图表示搜索的状态空间,红色五角星为答案,那么深度优先搜索算法产生的搜索树如下图所示,算法中矩形圈出的深层子树浪费了很多时间。
在这里插入图片描述
此时,可以从小到大限制搜索的深度,如果在当前深度限制下搜索不到答案,就把深度限制增加,重新进行一次搜索,这就是迭代加深思想。

所谓“迭代”,就是以上一次的结果为基础,重复执行以逼近答案的思想,迭代加深搜索的过程如下:
在这里插入图片描述
虽然搜索过程中深度限制为 d d d时,会重复搜索 1 ∼ d − 1 1\sim d-1 1d1层的节点,但是当搜索树节点分支数目较多时,随着层数的深入,每层节点数会呈指数级增长,这点重复搜索与深层子树的规模相比,实在是小巫见大巫了。

总而言之,当搜索树规模随着层次的深入增长很快,并且题目能够确保答案在一个较浅层的节点时,就可使采用迭代加深的深度优先搜索算法来解决。例如,有些题目描述会包含“如果10步内搜索不到结果就算无解”的情况。

算法实现

寻找最短加成序列恰好符合迭代加深搜索的情况,序列的长度 m ( m ≤ 10 ) m(m\le10) mm10不会太大,但是每次枚举两个数的和产生的分支很多,即搜索树规模随着层次的深入增长很快,并且答案在一个较浅层的节点。算法实现的基本过程如下:

  • 序列中的第一个数为 1 1 1,即 X [ 1 ] = 1 X[1]=1 X[1]=1
  • 依次搜索序列中的每个位置 k k k
    • 当到达限制搜索深度时,搜索结束,如果序列中最后一个数为 n n n,即 X [ m ] = n X[m]=n X[m]=n,则找到最短加成序列。
    • 为了保证 X [ k ] = X [ i ] + X [ j ] X[k]=X[i]+X[j] X[k]=X[i]+X[j],枚举序列已确定的任意两个数求和,将其填入 k k k位置
    • 继续搜索 k + 1 k+1 k+1位置

算法优化

  • 优化搜索顺序:为了最快搜索到 n n n,可以优先枚举序列中较大的数
  • 排除等效冗余:对于序列中两个数的和,如果已经搜索过,就没有必要在递归搜索了,例如: 1 + 4 1+4 1+4 2 + 3 2+3 2+3,其和都为 5 5 5,搜索一次即可。

代码实现

#include <iostream>
using namespace std;
const int N = 105;
int x[N]; //加成序列
int n, m = N;
//k表示序列当前位置,d表示限制搜索深度
bool dfs(int k, int d)
{
    //达到限制搜索深度时,如果序列中最后一个元素为n,返回真,否则返回假
    if(k == d) return x[k - 1] == n; 
    bool st[N] = {0}; //通过标记,排除等效冗余,即已经搜索过的和
    //优化搜索顺序,优先选择较大的数进行求和
    for(int i = k - 1; i >= 0; i --)
    {
        for(int j = i; j >= 0; j --)
        {
            int sum = x[i] + x[j];
            if(sum <= x[k - 1] || sum > n || st[sum]) continue;
            st[sum] = true;
            x[k] = sum;
            if(dfs(k + 1, d)) return true;
        }
    }
    return false;
}
int main()
{
    x[0] = 1; // 第1个数字是1
    while(cin >> n, n)
    {
        int d = 1; //从深度1开始,迭代加深搜索,直到找到一组加成序列
        while(!dfs(1, d)) d ++;
        for(int i = 0; i < d; i ++) cout << x[i] << " ";
        cout << endl;
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1517882.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

泽众云真机-机型支持ADB调试功能即将上线

最近云真机平台在线客服&#xff0c;收到很多咨询关于ADB调试功能&#xff0c;什么时候能更新&#xff1f;据小编所知&#xff0c;正在升级之中&#xff0c;有一块专门为了解决ADB调试功能提前准备&#xff0c;升级网络硬件设备&#xff0c;目前平台的功能已开发完成&#xff0…

windows 资源管理器(explorer)占用高的问题

找到配置 win r 输入 gpedit.msc 打开本地组策略管理器 扎到本地计算机策略-》 用户配置-》管理模板-》 windows组件-》 搜索 将后续的设置项均设置为已禁用

SpringTask实现的任务调度与XXL-job实现的分布式任务调度【XXL-Job工作原理】

目录 任务调度 分布式任务调度 分布式任务调度存在的问题以及解决方案 使用SpringTask实现单体服务的任务调度 XXL-job分布式任务调度系统工作原理 XXL-job系统组成 XXL-job工作原理 使用XXL-job实现分布式任务调度 配置调度中心XXL-job 登录调度中心创建执行器和任务 …

CVPR2023 | 3D Data Augmentation for Driving Scenes on Camera

3D Data Augmentation for Driving Scenes on Camera 摄像机驾驶场景的 3D 数据增强 摘要翻译 驾驶场景极其多样和复杂&#xff0c;仅靠人力不可能收集到所有情况。虽然数据扩增是丰富训练数据的有效技术&#xff0c;但自动驾驶应用中现有的摄像头数据扩增方法仅限于二维图像…

MySQL order by 语句执行流程

全字段排序 假设这个表的部分定义是这样的&#xff1a; CREATE TABLE t (id int(11) NOT NULL,city varchar(16) NOT NULL,name varchar(16) NOT NULL,age int(11) NOT NULL,addr varchar(128) DEFAULT NULL,PRIMARY KEY (id),KEY city (city) ) ENGINEInnoDB; 有如下 SQL 语…

自动控制原理--matlab/simulink建模与仿真

第一讲 自动控制引论 第二讲 线性系统的数学模型 第三讲 控制系统的复域数学模型(传递函数) 第四讲 控制系统的方框图 /video/BV1L7411a7uL/?p35&spm_id_frompageDriver pandas, csv数据处理 numpy&#xff0c;多维数组的处理 Tensor&#xff0c;PyTorch张量 工作原理图…

留学生课设|R语言|研究方法课设

目录 INSTRUCTIONS Question 1. Understanding Quantitative Research Question 2. Inputting data into Jamovi and creating variables (using the dataset) Question 3. Outliers Question 4. Tests for mean difference Question 5. Correlation Analysis INSTRUCTIO…

Tomcat的使用

1. Tomcat 1.1 Tomcat 是什么 Tomcat 就是基于 Java 实现的一个开源免费, 也是被广泛使用的 HTTP 服务器 1.2 下载安装 Tomcat官网选择其中的 zip 压缩包, 下载后解压缩即可&#xff0c;解压缩的目录最好不要带 “中文” 或者 特殊符号 进入 webapps 目录,每个文件夹都对应…

graylog API 弱密码

graylog web 页面密码设置 输入密码&#xff1a;获取sha256加密后密码 echo -n "Enter Password: " && head -1 </dev/stdin | tr -d \n | sha256sum | cut -d" " -f1vi /etc/graylog/server/server.conf #修改以下配置 root_usernameroot ro…

Monorepo 解决方案 — 基于 Bazel 的 Xcode 性能优化实践

背景介绍 书接上回《Monorepo 解决方案 — Bazel 在头条 iOS 的实践》&#xff0c;在头条工程切换至 Bazel 构建系统后&#xff0c;为了支持用户使用 Xcode 开发的习惯&#xff0c;我们使用了开源项目 Tulsi 作为生成工具&#xff0c;用于将 Bazel 工程转换为 Xcode 工程。但是…

【爬虫开发】爬虫从0到1全知识md笔记第1篇:爬虫概述【附代码文档】

爬虫开发从0到1全知识教程完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;爬虫概述。selenium的其它使用方法。Selenium课程概要。常见的反爬手段和解决思路。验证码处理。chrome浏览器使用方法介绍。JS的解析。Mongodb的介绍和安装,小结。mongodb的简单使…

信息系统项目管理师--干系人管理

干系人会受到项⽬积极或消极的影响&#xff0c;或者能对项⽬施加积极或消极的影响 项⽬经理和团队管理⼲系⼈的能⼒决定着项⽬的成败。为提⾼项⽬成功的概率&#xff0c; 尽早开始识别⼲系⼈并引导⼲系⼈参与。当项⽬章程被批准、项⽬经理被委任&#xff0c;以及团队开始组建之…

【剪枝实战】使用VGGNet训练、稀疏训练、剪枝、微调等,剪枝出只有3M的模型

摘要 本次剪枝实战是基于下面这篇论文去复现的&#xff0c;主要是实现对BN层的γ/gamma进行剪枝操作&#xff0c;本文用到的代码和数据集都可以在我的资源中免费下载到。 相关论文&#xff1a;Learning Efficient Convolutional Networks through Network Slimming (ICCV 2017…

算法---滑动窗口练习-3(水果成篮)

水果成篮 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;水果成篮 2. 讲解算法原理 算法的主要思想是使用滑动窗口来维护一个包含最多两种水果的子数组。定义两个指针 left 和 right 分别表示窗口的左边界和右边界。还定义了一个数组 hash 来记录水…

【新书推荐】29.1 32位汇编基本概念

第二十九章 32处理器体系结构 这一章我们将讲述32处理器体系结构。包括32位计算机的一些基本概念&#xff0c;32位处理器&#xff0c;程序加载执行的过程&#xff0c;32位计算机的硬件组成和输入输出系统。 29.1 基本概念 本节内容&#xff1a; ■实模式与保护模式 ■操作系…

Css提高——flex布局及其相关属性

目录&#xff1a; 1、传统布局与flex布局的区别 2、flex的布局原理 3、flex常见的父项属性 3.1、flex-direction &#xff1a;设置主轴的方向 3.2、justify-content 设置主轴上的子元素排列方式 3.3、flex-wrap 设置子元素是否换行 3.4、align-items 设置侧轴上的子元素排…

北京保险服务中心携手镜舟科技,助推新能源车险市场规范化

2022 年&#xff0c;一辆新能源汽车在泥泞的小路上不慎拖底&#xff0c;动力电池底壳受损&#xff0c;电池电量低。车主向保险公司报案&#xff0c;希望能够得到赔偿。然而&#xff0c;在定损过程中&#xff0c;保司发现这辆车的电池故障并非由拖底事件引起&#xff0c;而是由于…

融入Facebook的世界:探索数字化社交的魅力

融入Facebook的世界&#xff0c;是一场数字化社交的奇妙之旅。在这个广袤的虚拟社交空间中&#xff0c;人们可以尽情展现自己、分享生活&#xff0c;与全球朋友、家人和同事保持紧密联系&#xff0c;共同探索社交互动的乐趣与魅力。让我们深入了解这个世界的魅力所在&#xff1…

Docker 安装部署MySQL教程

前言 Docker安装MySQL镜像以及启动容器&#xff0c;大致都是三步&#xff1a;查询镜像–>拉取镜像–>启动容器 1、查询镜像 docker search mysql2、拉取镜像 拉取镜像时选择stars值较高的 docker pull mysql:5.7 #这里指定拉取对应的版本Mysql5.7&#xff0c;没有指…

冒泡排序,详详解解

目录 基本概念&#xff1a; 上图&#xff1a; 核心思路&#xff1a; 基本步骤&#xff1a; 关键&#xff1a; 代码核心&#xff1a; 补充&#xff1a; 代码&#xff08;规范&#xff09; &#xff1a; 代码&#xff08;优化&#xff09;&#xff1a; 今天我们不刷力扣了&…