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

线上OJ:

【01NOIP普及组】数的计数

核心思想:

1、样例中给到了 f6 = 6。其实这里包含了 f3=2, f2=2, f1=1, 以及6本身。

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

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

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

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

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

f6 = f3 + f2 + f1 + 1

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

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

题解代码:
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 ;
}
相关推荐
十二6 小时前
【洛谷题解】P1083 [NOIP 2012 提高组] 借教室(二分答案 + 差分)
数据结构·c++·算法·蓝桥杯
小此方7 小时前
[算法实战论:动态规划]回文串问题的dp解法,回文串问题的母题,以及以此为基础的派生题
算法·动态规划
Pniubi8 小时前
力扣560.和为k的子数组
算法·leetcode·职场和发展
D e re k ZH8 小时前
C++ 从零入门(一):基础语法与程序结构
数据结构·c++·算法
Pniubi9 小时前
力扣438.找到字符串中所有字母异位词
算法·leetcode·职场和发展
zjxtxdy10 小时前
C++面向对象程序开发-类与对象
开发语言·c++
東隅已逝,桑榆非晚11 小时前
算法6. 双指针法-查找总价格为目标的两个商品
c++·学习·算法
Eyfcom12 小时前
〖物联网终端实战 01〗UWB 室内高精度定位:仓储 AGV 与人员的厘米级轨迹追踪
物联网·算法·物流系统·快递系统·跨境物流快递系统·物联网终端实战
qq_4069810312 小时前
c++拷贝构造函数
开发语言·c++
bro_Java66612 小时前
《排序的底层逻辑:比较、交换与分治》
java·算法·排序算法