[洛谷]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 @   俺叫西西弗斯  阅读(0)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示