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了!

 #include <bits/stdc++.h>
using namespace std;
int f[];
int main()
{
int n;
cin>>n;
f[]=;
for(int i=;i<=n;i++)
{
f[i]=f[i-];
if(i%==)
f[i]+=f[i/];
}
cout<<f[n];
return ;
}

洛谷 P1028 数的计算【递推】的更多相关文章

  1. 洛谷--P1028 数的计算(递推)

    题意:链接:https://www.luogu.org/problem/P1028 先输入一个自然数n (n≤1000) , 然后对此自然数按照如下方法进行处理: 不作任何处理; 在它的左边加上一个自 ...

  2. 洛谷 P1028 数的计算

    嗯... 首先这道题想到的就是递推.... 但是递推失败 (不知道自己是怎么想的 然后又想打一个暴力,但是数的最高位太难存储了,所以又放弃了(并且好像这个暴力大约500就会炸... 然后看了题解,才发 ...

  3. 洛谷P1028 数的计算 题解 动态规划入门题

    题目链接:https://www.luogu.com.cn/problem/P1028 题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数 \(n\) ): 先输入一个自然数 \(n(n \ ...

  4. 洛谷P1028 数的计算

    https://www.luogu.org/problem/P1028 #include<cstdio> using namespace std; int main(){ ,i,f[]; ...

  5. (Java实现) 洛谷 P1028 数的计算

    题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数nn): 先输入一个自然数n(n≤1000),然后对此自然数按照如下方法进行处理: 不作任何处理; 在它的左边加上一个自然数,但该自然数不能 ...

  6. 洛谷P1028.数的计算(动态规划)

    题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n≤1000),然后对此自然数按照如下方法进行处理: 1.不作任何处理; 2.在它的左边加上一个自然数,但该自然 ...

  7. (递推)codeVs1011 && 洛谷P1028 数的计算

    题目描述 Description 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 1.          不 ...

  8. 洛谷P1028数的计算

    https://www.luogu.org/problemnew/show/P1028 只用递归会超时,需要用递归型动规,用一个数组保存已经算过的值,避免重复计算. 求数字为n的方案数的最优子结构为: ...

  9. Java实现 洛谷 P1028 数的计算

    import java.util.Scanner; import java.util.Arrays; public class Main { private static Scanner cin; p ...

随机推荐

  1. jQuery架构(源码)分析

    ( function( global, factory ) { "use strict"; if ( typeof module === "object" &a ...

  2. cell的复用机制

    以下全部都是转载自别人的博客:http://blog.sina.com.cn/s/blog_9c3c519b01016aqu.html 转自:http://www.2cto.com/kf/201207 ...

  3. Oracle初级——续续篇

    逝者如斯夫,不舍昼夜 所有的SQL都经过测试,可粘贴,可复制,有问题请各位大神指出...... --约束 与表一起使用 约束不合理的数据,使其不能进入表中? ','李小龙','一班','该学生成天练武 ...

  4. 点分治X2

    1.聪聪可可 点分治板子 然而想那个 t1[1]*t1[2]*2+t1[0]*t1[0]想了好久 就是最基本的组合方法 毕竟(2,5)和(5,2)可是要算两次的 画画图就好了 (不要像我一样盯着大佬们 ...

  5. vue-router项目实战总结

    今天来谈谈vue项目{vue,vue-router,component}三大神将之一的vue-router.作为我们前后端分离很重要的实践之一,router帮我们完成了SPA应用间的页面跳转. 并且, ...

  6. lesson - 3 笔记 ls /alias /ldd /cd /pwd /环境变量 / 目录

    一.ls 命令 作用:用来显示目录列表. 语法: ls  (选项) (参数) 选项: -a: 显示所有档案以及目录(ls内定将档案或目录名称为“./..”的视为隐藏) -A: 显示除隐藏文件“./.. ...

  7. Unix 文件系统读写时权限校验

    文件系统中的所有文件都是在读出或写入时进行权限校验 一个问题,如果一个用户对一个普通文件有读写权限,在使用vim编辑时,管理员撤销掉此用户对此文件的写入权限 那么,这个普通用户还可以将修改写入文件吗?

  8. ASP.NET Core读取AppSettings

    http://www.tuicool.com/articles/rQruMzV 今天在把之前一个ASP.NET MVC5的Demo项目重写成ASP.NET Core,发现原先我们一直用的Configu ...

  9. Django学习日记04_模板_overview

    通过Django中的模板,使得设计人员和网站管理有一个对接的接口,实现网页设计和逻辑的分离,因此,模板会处理大量的文本解析内容,django中内部使用了高效的引擎来完成模板解析. 模板设置 在使用模板 ...

  10. Tablayout ViewPage 使用示例

    上一篇文章介绍了使用 FragmenttabHost 来使用 tab 导航:到 Android 5.0 的时候,又推出了 TabLayout.因此,有必要对tablayout 进行了解下. 首先我们来 ...