洛谷 P1028 数的计算【递推】
P1028 数的计算
题目描述
我们要求找出具有下列性质数的个数(包含输入的自然数n):
先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理:
1.不作任何处理;
2.在它的左边加上一个自然数,但该自然数不能超过原数的一半;
3.加上数后,继续按此规则进行处理,直到不能再加自然数为止.
输入输出格式
输入格式:
一个自然数n(n<=1000)
输出格式:
一个整数,表示具有该性质数的个数。
输入输出样例
输入样例#1:
6
输出样例#1:
6
说明
满足条件的数为
6,16,26,126,36,136
题目链接:https://www.luogu.org/problem/show?pid=1028
分析:
就是比如一个数6,然后可以添加一个比6/2小的数(题目是左边,为了好理解就直接添加),然后可以再添加一个比6/2/2小的数,直到0为止。比如一个数7的其中一段递归:
- 比7/2小的数其中有一个3,新数就可以是73;
- 比3/2小的数只有一个1,于是新数就是731。
再举个例,12:
- 比12/2小的数其中有一个6,新数就可以是126;
- 比6/2小的数中有3、2,新数就可以是1263或1262;
- 比3小的有1,比2小的也是1,新书就是12631或12621。
这么解释大家应该都看懂了吧。
在打代码之前,我们不妨手动模拟一下
n=0,n=1时,答案显然是1
n=2, ans=2; n=3,ans=2
n=4,ans=4; n=5,ans=4
n=6,ans=6; n=7,ans=6
相信大家也发现了,2n与2n+1(n为非负整数)的答案是一样的 这就是第一个规律
然后我们以n=8为例,手动模拟一下
一共有10组解
8 1 8 2 8 3 8 4 8
1 2 8 1 3 8 1 4 8 2 4 8
1 2 4 8
我打出的东西很像一棵搜索树。。。
当我们把8和8下面的左三棵子树放在一起(即8和下面三列),并将所有的8都改成7,我们能发现,我们得到了n=7时的所有解;
我们再把最右端的子树(即剩下的部分)中的所有8删去,我们得到了n=4时的所有解
就这样,我们可以得到一个递推式,
f(n)=f(n-1) //7=8-1
+f(n/2) //4=8/2
再结合之前发现的规律
就能得到:
n%2==0时
f(n)=f(n-1)+f(n/2)
n%2==1时
f(n)=f(n-1)
然后问题就迎刃而解啦
设f[i]为初始值为i时的满足条件总数,可得f[i]=f[1]+f[2]+f[3]+...+f[i/2];容易想到f[1]=1;
因为f[i]=f[1]+f[2]+f[3]+...+f[i/2] 所以当i为奇数时f[i]=f[i-1],当i为偶数时f[i]=f[i-1]+f[i/2];
然后我们可以手动AC了!
1 #include <bits/stdc++.h>
2 using namespace std;
3 int f[1001];
4 int main()
5 {
6 int n;
7 cin>>n;
8 f[1]=1;
9 for(int i=2;i<=n;i++)
10 {
11 f[i]=f[i-1];
12 if(i%2==0)
13 f[i]+=f[i/2];
14 }
15 cout<<f[n];
16 return 0;
17 }
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android:Field can be converted to a local varible.的解决办法
- Android使用多线程进行网络聊天室通信
- android实现banner轮播图无限轮播效果
- Android CheckBox中设置padding无效解决办法
- Android开发中使用颜色矩阵改变图片颜色,透明度及亮度的方法
- Android手势左右滑动效果
- Android开发实现根据包名判断App运行状态的方法
- Android实现朋友圈多图显示功能
- Android实现朋友圈评论回复列表
- android调用webservice接口获取信息
- RecyclerView嵌套RecyclerView完美实现京东tab吸顶效果
- Android使用SmsManager实现短信发送功能
- Kotlin结合Rxjava+Retrofit实现极简网络请求的方法
- 用Android Studio3.0新功能加快构建速度
- Android实现图片添加阴影效果的2种方法