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 }

转载于:https://www.cnblogs.com/ECJTUACM-873284962/p/7744886.html

洛谷 P1028 数的计算【递推】相关推荐

  1. 洛谷 P1028 数的计算

    递推计算即可 f[1]=1 f[2]=2=f[1]+1 f[3]=2=f[1]+1 f[4]=4=f[1]+f[2]+1 f[5]=4=f[1]+f[2]+1 我的代码(算法借鉴洛谷题解) #incl ...

  2. 洛谷 - P1028 数的计算(线性dp)

    题目链接:点击查看 题目大意:现在给出一个自然数n,我们规定三种操作: 不做任何处理 在他左边加上一个自然数,但该数不能超过原数的一半 加上该数后,继续按此规则进行处理,直到不能再加自然数为止 举个例 ...

  3. Java 洛谷 P1028 数的计算

    题目链接:https://www.luogu.com.cn/problem/P1028 代码实例: import java.util.Scanner;public class Main {public ...

  4. 洛谷【算法1-4】递推与递归

    P1255 数楼梯 对于 100% 的数据,1≤N≤5000. 高精度斐波那契 #include <iostream> using namespace std;const int N = ...

  5. 洛谷P5110:块速递推(特征根方程、光速幂)

    解析 去你的搬砖生成函数,特征根太香了. 一开始我是用生成函数解的,和特征根相比有亿点点搬砖- 但是这个东西原理似乎使用一些神奇的等比差分,有些玄学,生成函数较易理解. 背下来背下来! 就以本题为情境 ...

  6. 洛谷 1057——传球游戏(递推与递归二分)

    题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同 ...

  7. 洛谷 1057——台阶问题(递推与递归二分)

    题目描述 有N级的台阶,你一开始在底部,每次可以向上迈最多K级台阶(最少1级),问到达第N级台阶有多少种不同方式. 输入输出格式 输入格式: 输入文件的仅包含两个正整数N,K. 输出格式: 输入文件s ...

  8. 信息学奥赛一本通 1316:【例4.6】数的计数(Noip2001) | 1914:【01NOIP普及组】数的计数 | 洛谷 P1028 [NOIP2001 普及组] 数的计算

    [题目链接] ybt 1316:[例4.6]数的计数(Noip2001) ybt 1914:[01NOIP普及组]数的计数 洛谷 P1028 [NOIP2001 普及组] 数的计算 [题目考点] 1. ...

  9. 递归——数的计算(洛谷 P1028)

    题目选自洛谷P1028 读完题目很容易想到用递归,但是当输入的数据比较大以后,直接递归会超时了, 所以采用记忆化搜索的方式进行递归,当然这道题也可以用递推的方式直接求解. 题目描述 我们要求找出具有下 ...

最新文章

  1. 计算机书籍-Go语言入门经典SAMS Teach Yourself
  2. 浅谈ASP.net中的DataSet对象
  3. 【Android 修炼手册】常用技术篇 -- Android 自定义 View
  4. 基于jsp+Spring boot+mybatis的图书管理系统设计和实现
  5. Linux一个坑-安装pip更新源
  6. 为何要弃 Java、Swift 于不顾,而选择 Python?
  7. 【操作系统】滨江学院 陈遥 期末试卷考点整理
  8. java编写数字时钟_用JAVA写数字时钟
  9. Nginx做反向代理的问题
  10. 猪齿鱼_01_环境搭建(一)_微服务支撑组件部署(源码形式)
  11. oracle归档日志循环,oracle归档日志增长过快处理方法,oracle归档日志
  12. 贝壳找房2018算法笔试
  13. <华为VRP系统>ENSP模拟器安装:
  14. ecshop smarty php,ecshop的smarty基础普及知识
  15. 平安银行软件测试项目,中国平安银行关于软件测试笔试试题(一)
  16. 运筹说 第73期 | 图论创始人“数学之王”一 欧拉
  17. 经济学人 纽约时报 时代周刊 华尔斯日报对比
  18. KUKA - KRL
  19. 说说308,华泰股份
  20. Android Camera简单整理(四)-Android Camera性能Debug经验

热门文章

  1. 路由器setup模式
  2. windows server 2003优化设置方法
  3. 【Java数据结构】计算机中数据的存储方式(为什么要使用B树)
  4. 小程序入门学习14--用户管理
  5. Linux系统管理(7)——Linux单用户模式详解 及应用场景
  6. 11张高清Python全知识地图,强烈建议学习
  7. awr报告 解读_AWR报告分析解读
  8. opencv裁剪图片_前端智能化实践——从图片识别UI样式
  9. android js交互 数组,Android WebView —— Java 与 JavaScript 交互总结
  10. Evolution Game DP