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],而不必进行接下来的计算了,否则还是按照刚才递归的方式计算,然后将结果存入数组中以便之后再次调用。

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【报错解决】-bash: export: `-8‘: not a valid identifier 不是有效的标识符

现象 一登陆就提示-bash: export: -8’: not a valid identifier 不是有效的标识符 问题出现的原因 设置字符集时多写了空格 [rootdb1 ~]# cat >>/etc/profile<<EOF export LANGen_US.UTF -8(-8前不应有空格) EOF 解决方法 cd /etc vi profile 把export带有-8的…

「C++ 类和对象篇 10」初始化列表

目录 一、什么是初始化列表&#xff1f; 二、为什么需要初始化列表&#xff1f; 三、初始化列表怎么使用&#xff1f; 3.1 在构造函数中使用初始化列表 3.2 注意 3.3 结论 3.4 应用场景 四、初始化列表的初始化顺序 五、另一种初始化成员变量的方法 【总结】 一、什么是初始化…

快速幂的应用

1.非递归的解法 #include <iostream> using namespace std; int main(){int a,b,c,t1;cin>>a>>b>>c;if(a>2&&a<1e3&&b>0&&a<1e7&&c>2&&c<1e5)for(int i0;i<b;i)tt*a%c;cout<<t;r…

51单片机编程应用(C语言):篮球比赛计分器

设计思路 1.LCD1602显示A 000:B 000 右下角显示24的数字&#xff0c;显示一节时间12&#xff1a;00. 2.规定矩阵键盘每一位表示的含义 s1按下&#xff0c;A队加一分 s2按下&#xff0c;A队加两分 s3按下&#xff0c;A队加三分 s4按下&#xff0c;A队减一分 如…

[数学]高斯消元

介绍 用处&#xff1a;求解线性方程组 加减消元法和代入消元法 这里引用了高斯消元解线性方程组----C实现_c用高斯消元法解线性方程组-CSDN博客 改成了自己常用的形式&#xff1a; int gauss() {int c, r; // column, rowfor (c 1, r 1; c < n; c ){int maxx r; //…

【开源】JAVA+Vue.js实现衣物搭配系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 衣物档案模块2.2 衣物搭配模块2.3 衣物收藏模块 三、系统设计3.1 用例设计3.2 E-R图设计3.3 数据库设计3.3.1 衣物档案表3.3.2 衣物搭配表3.3.3 衣物收藏表 四、系统实现4.1 登录页4.2 衣物档案模块4.3 衣物搭配模块4.4…

奶茶点餐|奶茶店自助点餐系统|基于微信小程序的饮品点单系统的设计与实现(源码+数据库+文档)

奶茶店自助点餐系统目录 目录 基于微信小程序的饮品点单系统的设计与实现 一、前言 二、系统功能设计 三、系统实现 1、商品信息管理 2、商品评价管理 3、商品订单管理 4、用户管理 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xff1a; 五、核心代码 …

【深度学习:语义分割】语义分割简介

【深度学习&#xff1a;语义分割】语义分割简介 什么是图像分割&#xff1f;了解语义分割数据采集语义分割的深度学习实现全卷积网络上采样跳跃连接U-NetDeepLab多尺度物体检测金字塔场景解析网络&#xff08;PSPNet&#xff09; 语义分割的应用医学影像自动驾驶汽车农业图片处…

MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(1)-后端项目框架搭建

前言&#xff1a; 前面的四个章节我们主要讲解了MongoDB的相关基础知识&#xff0c;接下来我们就开始进入使用.NET7操作MongoDB开发一个ToDoList系统实战教程。本章节主要介绍的是如何快熟搭建一个简单明了的后端项目框架。 MongoDB从入门到实战的相关教程 MongoDB从入门到实战…

华为OD机试 - 分配土地( Python C C++ JavaGo JS PHP)

题目描述 从前有个村庄&#xff0c;村民们在各种田地上插上小旗子&#xff0c;每个旗子上都标识了一个数字。现在&#xff0c;村民们想要找出一个包含相同数字的最小矩形区域&#xff0c;并将这块土地分配给对村庄做出巨大贡献的村民。我们需要找出这个矩形区域的最大面积。 …

js基础(2)

对象 object也是js的一种数据类型 其静态特征可以用基本数据类型表示 动态行为可以用函数表示 语法&#xff1a; 增删改查 查&#xff1a;对象.属性 改: 对象.属性值 增&#xff1a;对象.新属性名新值 删&#xff1a;delete 对象.属性名 查的另一种写法&#xff1a; 对…

算法学习——LeetCode力扣双指针篇

算法学习——LeetCode力扣双指针篇1 27. 移除元素 27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#…