zoukankan      html  css  js  c++  java
  • 洛谷 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 }
  • 相关阅读:
    Spring Boot的每个模块包详解
    spring框架所有包说明
    TCP三次握手和四次挥手
    线程池实现原理
    AVL树与红黑树
    去哪儿网面经
    什么是缓存一致性问题?如何解决?
    Redis的应用场景和优缺点
    线程池
    手写快排
  • 原文地址:https://www.cnblogs.com/ECJTUACM-873284962/p/7744886.html
Copyright © 2011-2022 走看看