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

P1028 [NOIP2001 普及组] 数的计算题解

题目

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

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

请你求出,一共有多少个合法的数列。两个合法数列a,b不同当且仅当两数列长度不同或存在一个正整数i≤∣a∣,使得a_{i}\neq b_{i}​。

输入输出格式

输入格式

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

输出格式

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

输入输出样例

输入样例

6

输出样例

6

解析

对于一个整数n,如果只考虑变换一次,那么问题就很简单了,答案就是n/2+1,但是还需要对变换后的继续变换。比如说,数列中最开始只有一个元素8,在末尾加入一个新元素,列表就可以变成[8 4]、[8 3]、[8 2]、[8 1],算上[8]一共有五种情况,之后的变换只需要按照上面的这种方法,分别是计算[4]、[3]、[2]、[1]按照这样的操作能有几种情况,然后累加统计即可。

原来是要解决n=8的问题,现在分解成了4个规模更小但本质上同样的子问题;如果要解决n=4的问题,基于同样的思想还可以分解成两个规模更小的单质相同的子问题;当需要解决n=2的问题时,可以分解成n=1的问题(只有n=1的情况了);直到n=1时,没法继续分解,根据题目说的“不作任何处理就直接统计为一种合法的数列”,可以直接返回只有唯一一种数列,即[1]。然后返回上一层接受到所有小规模问题的答案,合并统计处理获得这个规模下的答案,再继续返回上一层……直到求得问题的解。

像这样构造函数,这个函数在运行过程中调用自己,从而解决问题的思路就称为递归思想。

#include<iostream>
#include<cstring>
using namespace std;
int n,count,f[1010];
int sol(int x){int count=1;if(f[x]!=-1){return f[x];}for(int i=1;i<=x/2;i++){count+=sol(i);}return f[x]=count;
}
int main(){cin>>n;memset(f,-1,sizeof(f));f[1]=1;cout<<sol(n)<<endl;return 0;
}

直接使用递归运行效率很低,为了防止做很多无用功,可以定义一个数组f,其每一项f[i]就是当问题规模为i的时候的答案,首先将数组初始化为-1,说明f[i]还没有被计算过。依然使用同样的方法去求解,只是如果发现已经计算过就直接返回f[i],而不必进行接下来的计算了,否则还是按照刚才递归的方式计算,然后将结果存入数组中以便之后再次调用。

这样,每个数字最多只计算一次,因为一旦计算完成就会被存下来,便于日后使用,这样的思想称为“记忆化搜索”。

相关文章:

  • 计算机网络基本知识(二)
  • 相机图像质量研究(7)常见问题总结:光学结构对成像的影响--镜片固化
  • C++ //练习 5.5 写一段自己的程序,使用if else语句实现把数字成绩转换成字母成绩的要求。
  • hook函数——useRef
  • LabVIEW工业监控系统
  • 【Linux】Ubuntu 22.04 升级 nodejs 到 v18
  • 伪装成NodeJS的勒索病毒,勒索呼伦贝尔的空气
  • Linux运行级别 | 管理Linux服务
  • 【Linux系统学习】2.Linux基础命令
  • 华为配置内部人员接入WLAN网络示例(802.1X认证)
  • 《杨绛传:生活不易,保持优雅》读书摘录
  • 【计算机网络】时延,丢包,吞吐量(分组交换网络
  • scss和less的区别
  • 【蓝桥杯冲冲冲】k 短路 / [SDOI2010] 魔法猪学院
  • 2.9日学习打卡----初学RabbitMQ(四)
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • CAP 一致性协议及应用解析
  • Hibernate最全面试题
  • PAT A1120
  • php中curl和soap方式请求服务超时问题
  • Spark学习笔记之相关记录
  • spring cloud gateway 源码解析(4)跨域问题处理
  • SQL 难点解决:记录的引用
  • vue-cli3搭建项目
  • webgl (原生)基础入门指南【一】
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 从零开始在ubuntu上搭建node开发环境
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前嗅ForeSpider教程:创建模板
  • 微信小程序--------语音识别(前端自己也能玩)
  • 译米田引理
  • ​一些不规范的GTID使用场景
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #mysql 8.0 踩坑日记
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (安卓)跳转应用市场APP详情页的方式
  • (二)斐波那契Fabonacci函数
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (六)Hibernate的二级缓存
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (循环依赖问题)学习spring的第九天
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转) 深度模型优化性能 调参
  • .Net Web项目创建比较不错的参考文章
  • @Autowired标签与 @Resource标签 的区别
  • @staticmethod和@classmethod的作用与区别