2001NOIP普及组真题 1. 数的计数

线上OJ:

【01NOIP普及组】数的计数

核心思想:

1、样例中给到了 f[6] = 6。其实这里包含了 f[3]=2, f[2]=2, f[1]=1, 以及6本身。

注解:按照题意,6前面的数字只能是3,2,1,或者不放(不放就是6本身)

当6前面放3的时候,那3有多少种可能性,就都可以叠加在这里。即 f[6] += f[3]

同理,当6前面放2的时候,2的所有可能性也都叠加在这里 f[6] += f[2]

同理,当6前面放2的时候,2的所有可能性也都叠加在这里 f[6] += f[1]

最后,加上6自己本身,所以

f[6] = f[3] + f[2] + f[1] + 1

2、综上所述,我们可以从 f[1] 开始逐步计算每个 f[i],直到 f[N](时间复杂度是 O ( 1000 ∗ 1000 ) = O ( 1 0 6 ) O(1000*1000)=O(10^6) O(1000∗1000)=O(106))。

3、最后根据输入的 n,直接输出 f[n] 即可。

题解代码:
cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

const int N = 1000;
int n, f[N];

int main()
{
    f[1] = 1;  // 初始化 f[1],就只有自己
    for (int i = 2; i <= N; i++)
    {
        int x = i / 2;  // 针对每一个i,找到它不能超过的一半
        for(int j = 1; j <= x; j++)
            f[i] += f[j];   // 累加
        
        f[i]++;  // 最后加上自己    
    }    

    scanf("%d", &n);    
    printf("%d", f[n]);
    return 0 ;
}
相关推荐
闻缺陷则喜何志丹2 分钟前
【分块 差分数组 逆元】3655区间乘法查询后的异或 II|2454
c++·算法·leetcode·分块·差分数组·逆元
葛小白112 分钟前
C#进阶12:C#全局路径规划算法_Dijkstra
算法·c#·dijkstra算法
前端小L14 分钟前
图论专题(五):图遍历的“终极考验”——深度「克隆图」
数据结构·算法·深度优先·图论·宽度优先
CoovallyAIHub34 分钟前
超越像素的视觉:亚像素边缘检测原理、方法与实战
深度学习·算法·计算机视觉
CoovallyAIHub37 分钟前
中科大西工大提出RSKT-Seg:精度速度双提升,开放词汇分割不再难
深度学习·算法·计算机视觉
gugugu.37 分钟前
算法:位运算类型题目练习与总结
算法
百***976443 分钟前
【语义分割】12个主流算法架构介绍、数据集推荐、总结、挑战和未来发展
算法·架构
代码不停1 小时前
Java分治算法题目练习(快速/归并排序)
java·数据结构·算法
bubiyoushang8881 小时前
基于MATLAB的马尔科夫链蒙特卡洛(MCMC)模拟实现方法
人工智能·算法·matlab
玖剹2 小时前
穷举 VS 暴搜 VS 深搜 VS 回溯 VS 剪枝
c语言·c++·算法·深度优先·剪枝·深度优先遍历