洛谷--P1028 数的计算(递推)
题意:链接:https://www.luogu.org/problem/P1028
先输入一个自然数n (n≤1000) , 然后对此自然数按照如下方法进行处理:
-
不作任何处理;
-
在它的左边加上一个自然数,但该自然数不能超过原数的一半;
-
加上数后,继续按此规则进行处理,直到不能再加自然数为止
输出满足该性质数的个数。
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; }