P1028 数的计算

原题链接:https://www.luogu.org/problemnew/show/P1028

刚开始看到这题就想着直接暴力递归:

本蒟蒻觉得应该有人和我想的一样(手动滑稽),,,

#include
#include
#include
using namespace std;
int ans=1, n;
void func(int x)
{
    for(int i = 1; i <= x/2; ++i)
    {
        ans++;
        func(i);
    }
}

int main()
{
    scanf("%d", &n);
    func(n);
    printf("%d\n", ans);

    return 0;
}

很明显,这样是会超时的,

所以只能优化;

因为这是一道递归的题目,所以我们应该寻找一个递归的通式,那就从头开始找规律。

当n=0时,ans = 1;

n = 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;

所以,可以由此看出

当n%2 == 0时,f[n] = [n-1]+f[n/2];

当n%2 == 1时,f[n] = f[n-1];

所以,AC代码如下:

#include
#include
#include
using namespace std;
int n, f[1010];
int main()
{
    scanf("%d", &n);
    f[0] = f[1] = 1;
    for(int i = 2; i <= n; ++i)
    {
        if(i%2==0)
            f[i] = f[i/2]+f[i-1];
        else
            f[i] = f[i-1];
    }
    printf("%d\n", f[n]);
    return 0;
}

 

你可能感兴趣的:(过程与递归)