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

题意:链接:https://www.luogu.org/problem/P1028

先输入一个自然数(n1000) , 然后对此自然数按照如下方法进行处理:

  1. 不作任何处理;

  2. 在它的左边加上一个自然数,但该自然数不能超过原数的一半;

  3. 加上数后,继续按此规则进行处理,直到不能再加自然数为止 

输出满足该性质数的个数。

Sample Input:       

6                   

Sample output

6

说明:满足条件的数为6,16,26,126,36,136 

这道题是一道简单的递推题;我们可以先写几个样例:

n=0或1,ans=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,

n=8,ans=10( 8,18,28,128,38,38,138,48,248,1248)

n=9,ans=10,

n=10,ans=14.......

如果从前7个来看,很容易会认为如果n为偶数是,则等于它本身,奇数则是它的前一项偶数的个数

但是出来了一个8,ans等于10

所以,递推的规律就出来了

n%2==0时

    F(n)=F(n-1)+F(n/2);

n%2==1时

   F(n)=F(n-1);

AC代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1000050;
int fun[1005];
int main() {
    int n;
    cin>>n;
    fun[0]=fun[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(i%2==0)
            fun[i]=fun[i-1]+fun[i/2];
        else
                fun[i]=fun[i-1];
    }
    cout<<fun[n]<<endl;
}
View Code
原文地址:https://www.cnblogs.com/acmer-hmin/p/11754081.html