[洛谷]P1028数的计算 原创

算法标签:递推

题目来源 luogu

题目简介

在这里插入图片描述

思路

看着肯定是有规律的数列,我们直接试图找逻辑
s是当前的数值,n是存在的组合的数量,exm是直接把组合举例

s=0 n=1 0; s=1 n=1 1;
s=2 n=2 exm:12,2,s=3 n=2 exm:13,1;
s=4 n=4 exm:14,13,24,124;s=5 n=4 exm:15,25,125,5;
s=5 n=3 

观察发现:
if n%2==1 ansN=ansN-1
else ansN+=ansN(N/2)

AC代码

方法一:递推

#include <iostream>

using namespace std;
const int N=1e4;
int f[N];
int main()
{
    f[1]=1;
    int n;
    cin>>n;
    for(int i=2;i<=n;i++)
        if(i%2==1)f[i]=f[i-1];
        else f[i]=f[i-1]+f[i/2];
    
    cout<<f[n];//输出指定答案
    return 0;
}

在这里插入图片描述

方法2:递归

压缩成递归 如果是n的话会从1到n递归,但是分支太多,事实上很有超时的可能

#include<iostream>

using namespace std;

int res=0;

void dfs(int n)
{
    res++;
    for(int i=1;i<=n/2;i++)dfs(i); 
}

int main()
{
    int n;
    cin>>n;
    
    dfs(n);
    
    cout<<res;
    
    return 0 ;
}

在这里插入图片描述

posted @ 2021-03-29 23:22  俺叫西西弗斯  阅读(0)  评论(0)    收藏  举报  来源