【题解/普及】P1028 数的计算

来源:互联网 发布:tvb视频软件 编辑:程序博客网 时间:2024/06/15 03:57

https://www.luogu.org/problem/show?pid=1028

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

“原数”的含义,就是 你加上的自然数/给出的n 。

蒟蒻的暴力递归

void plus(int x){    for(int i=1;i<=x/2;i++)    {cnt++; plus(i);}}        

(8个测试点TLE)

正解貌似是神犇 vegetabird 的简单DP(其实就是打表找规律)

本题的规律就是

n%2==0时 f(n)=f(n-1)+f(n/2)

n%2==1时 f(n)=f(n-1)

f(1)=f(0)=0
有了递推式就可以用for循环求解了。附代码

#include<cstdio>using namespace std;int num[1001];void solve(int x){num[0]=num[1]=1;int i;for (i=2;i<=x;i++){    if (i%2==0)         num[i]=num[i-1]+num[i/2];            else num[i]=num[i-1];         }}int main(void){    int n;    scanf("%d",&n);    solve(n);    printf("%d",num[n]);    return 0;}


原创粉丝点击