当前位置: 首页 > news >正文

信奥赛C++提高组csp-s之搜索进阶(记忆化搜索案例实践2)

信奥赛C++提高组csp-s之搜索进阶(记忆化搜索案例实践2)

数的计算

题目描述

给出正整数n nn,要求按如下方式构造数列:

  1. 只有一个数n nn的数列是一个合法的数列。
  2. 在一个合法的数列的末尾加入一个正整数,但是这个正整数不能超过该数列最后一项的一半,可以得到一个新的合法数列。

请你求出,一共有多少个合法的数列。两个合法数列a , b a, ba,b不同当且仅当两数列长度不同或存在一个正整数i ≤ ∣ a ∣ i \leq |a|ia,使得a i ≠ b i a_i \neq b_iai=bi

输入格式

输入只有一行一个整数,表示n nn

输出格式

输出一行一个整数,表示合法的数列个数。

输入输出样例 1
输入 1
6
输出 1
6
说明/提示
样例 1 解释

满足条件的数列为:

  • 6 66
  • 6 , 1 6, 16,1
  • 6 , 2 6, 26,2
  • 6 , 3 6, 36,3
  • 6 , 2 , 1 6, 2, 16,2,1
  • 6 , 3 , 1 6, 3, 16,3,1
数据规模与约定

对于全部的测试点,保证1 ≤ n ≤ 10 3 1 \leq n \leq 10^31n103

思路分析

题目大意

输入自然数 n,可以对它进行以下操作:

  • 不作任何处理
  • 在它左边加上一个不超过原数一半的自然数
  • 加上数后继续按此规则处理
    求所有可能的数的个数(包含原数本身)。
分析思路

f[x]表示数字 x 能生成的数的总数(包含 x 自身)。根据规则:

  • x 可以不作处理 → 1 种(即 x 本身)
  • 可以在左边加上 1, 2, …, floor(x/2) 作为新的数,这些新数又可以继续生成

所以f[x] = 1 + f[1] + f[2] + ... + f[floor(x/2)]

递归计算时会有大量重复计算,例如f[6]需要f[3]f[5]也需要f[2]等,因此需要用数组记录每个 x 已经计算过的结果。

代码实现

#include<bits/stdc++.h>usingnamespacestd;intn;intf[1005];// f[i]存储数字i能生成的数的总数,-1表示未计算intdfs(intx){if(f[x]!=-1)returnf[x];// 记忆化:已计算直接返回intsum=1;// 1表示原数本身(不作任何处理)for(inti=1;i<=x/2;i++){sum+=dfs(i);// 递归计算加上每个可能数字后的方案数}returnf[x]=sum;// 存备忘录并返回}intmain(){ios::sync_with_stdio(false);cin.tie(0);cin>>n;memset(f,-1,sizeof(f));// 初始化备忘录cout<<dfs(n)<<endl;return0;}

功能分析

模块功能说明
备忘录数组f[1005]存储每个数字对应的方案总数,-1表示未计算
dfs(x)递归计算数字 x 能生成的所有数的总数
累加循环枚举所有不超过 x/2 的自然数,递归计算它们的方案数并累加
原数计入sum 初始化为 1,代表“不作任何处理”的情况
时间优化通过记忆化,每个数字只计算一次,复杂度 O(n²) → O(n)

更多系列知识,请查看专栏:《信奥赛C++提高组csp-s知识详解及案例实践》:
https://blog.csdn.net/weixin_66461496/category_13113932.html


各种学习资料,助力大家一站式学习和提升!!!

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"########## 一站式掌握信奥赛知识! ##########";cout<<"############# 冲刺信奥赛拿奖! #############";cout<<"###### 课程购买后永久学习,不受限制! ######";return0;}

1、csp信奥赛高频考点知识详解及案例实践:

CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转

CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转

信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html

2、csp信奥赛冲刺一等奖有效刷题题解:

信奥赛C++普及组csp-j初赛&复赛真题题解(持续更新)https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新)
https://blog.csdn.net/weixin_66461496/category_13125089.html

3、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转


GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html

4、csp/信奥赛C++,完整信奥赛系列课程(永久学习):

https://edu.csdn.net/lecturer/7901 点击跳转

· 文末祝福 ·

#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}
http://www.jsqmd.com/news/954678/

相关文章:

  • 端午手工民俗评比,时令主题微信投票在线创建 - 微信投票小程序
  • MusicFree插件系统完整指南:3分钟打造你的免费跨平台音乐聚合中心
  • 消防展厅多媒体互动设备【消防标识连连看】
  • Build 2026 刚讲完 Agent,我反而重看了一遍 MinerU
  • Mythos:首个具备符号执行与攻击链建模能力的AI安全代理
  • 遗传算法工程化:从失效诊断到可控演化系统构建
  • 从CPU视角看PCIe:深入理解x86/ARM平台上BAR、MMIO和PIO的地址翻译与访问机制
  • Hadoop程序报错 ‘No FileSystem for scheme hdfs‘?别慌,5分钟搞定core-site.xml配置
  • 万国中国官方售后服务中心实地考察报告_多信源验证(2026年6月最新) - 资讯速览
  • 微软MAI系列重磅发布:7款新模型宣称全面超越Claude与Google Nano Banana
  • 3个核心优势+5大实战场景:BBDown命令行工具重塑B站视频下载体验
  • 掘金Web3海外蓝海,你准备好了吗?
  • Mib是MB吗?一文读懂存储单位中的二进制与十进制之争
  • AI辅助开发:让Kimi等模型在快马平台上智能生成与优化JS质数代码
  • 【真实数据】小鼠视神经星形胶质细胞(Optic Nerve Astrocytes)的分离培养和鉴定
  • 终极Windows驱动清理指南:DriverStore Explorer完全使用教程
  • 遗传算法工程落地实战:编码选择、选择压力与变异平衡
  • 深度解析AI Agent的规划能力:从思维链到分层任务分解的决策机制
  • 2026年马尔代夫海岛游省钱攻略:高端度假预订渠道排行 - 奔跑123
  • 如何轻松捕获网页视频?猫抓浏览器扩展使用指南
  • 告别ifconfig!在Debian 10上使用现代ip命令和systemd配置网络与主机名
  • DIY手串设计系统的核心算法解析
  • 2026年宁夏KTV模块化装修与老旧KTV翻新改造深度选型指南 - 企业名录优选推荐
  • 国密加密(流程)
  • MusicFree开源插件系统:10分钟打造你的免费跨平台音乐聚合中心
  • 大模型能力瓶颈的四层认知墙与破局路径
  • 3个核心问题告诉你:为什么AnythingLLM是搭建私有AI助手的最佳选择?
  • MATLAB小波相干分析全功能包:交叉谱+相位差+AR1显著性检验一键运行
  • 厦门验潮站MATLAB调和分析实操包:含6组可视化结果与残差诊断
  • 2026年加勒比海蓬塔卡纳蜜月预订性价比排行 - 奔跑123