首页 > 其他分享 >第十五届蓝桥杯第三期模拟赛 《台阶问题》

第十五届蓝桥杯第三期模拟赛 《台阶问题》

时间:2024-04-08 20:59:45浏览次数:20  
标签:方案 总数 台阶 蓝桥 小蓝 楼梯 第三期 第十五届

问题描述

小蓝要上一个楼梯,楼梯共有 n 级台阶(即小蓝总共要走 n 级)。小蓝每一步可以走 a 级、b 级或 c 级台阶。
请问小蓝总共有多少种方案能正好走到楼梯顶端?

输入格式

输入的第一行包含一个整数 n
第二行包含三个整数 a, b, c

输出格式

输出一行包含一个整数,表示答案。答案可能很大,请输出答案除以 1000000007 后的余数。

问题类型

线性DP

问题分析

将一条线段看作是方案总数,设T[n]表示小蓝走到第n个台阶时的方案总数。如图:

上图中黄色代码块为理想情况下(即一次可以走a、b、c三种方案)的思路。
如果我们需要走到第i个台阶(假设i为较接近n但小于n的数,远大于每次可走的台阶数的最大值),其共可以是三种情况:从第i-a个台阶处、第i-b个台阶处、第i-c个台阶处分别上a、b、c个台阶。
所以我们需要知道当走到第i个台阶时共有多少种方案,在理想情况下,只需要知道走到第i-a个台阶处、第i-b个台阶处、第i-c个台阶处时分别有多少种方案,在三个台阶处的方案数基础上分别加1就是走到第i个台阶处的方案总数。
按此思路依次往前推导,假设a、b、c中a最小,则当i<a时,T[i] = 0。当i==a or i == b or i == c 时,T[i] = 1,这是因为在这三种情况下(不考虑a、b、c之间存在倍数关系),小蓝都是直接从第零个台阶处开始上楼梯的,我们需要判断i是否等于这三个数。

代码实现

n = int(input())
a, b, c = map(int, input().split())
T = [0] * (n + 1) # 可以看出在定义时T[0]的含义不明
# 必须清楚T[n]的含义是在走到第n个台阶时,实现上到第n个台阶的方案总数
mod = 1000000007
for i in range(min(a, b, c), n + 1):
    if i in (a, b, c):  # 我们可以省去此if语句,直接将T[0]赋值为1,则当i为a或b或c时可直接进行下面的三个自增操作
        T[i] = 1
    if i >= a:
        T[i] += T[i - a]
    if i >= b:
        T[i] += T[i - b]
    if i >= c:
        T[i] += T[i - c]
print(p[n] % mod)
# 代码实现较为抽象,不理解请多看几遍

标签:方案,总数,台阶,蓝桥,小蓝,楼梯,第三期,第十五届
From: https://www.cnblogs.com/nhwite/p/18122528

相关文章

  • 第十四届蓝桥杯省赛研究生组python
    目录试题A:工作时长excel处理代码试题B:分糖果试题C:填充试题D:互质数的个数题解:暴力试题E:阶乘的和题解:暴力+备忘录试题F:公因数匹配题解:暴力试题G:小蓝的旅行计划题解试题A:工作时长excel处理把数据复制到excel,并选中列右键选择设置单元格格式注意:因为求和之后总小时数可能会超过2......
  • 蓝桥杯赛前突击
    蓝桥杯赛前突击1.大纲精读官方只支持Dev-cpp5.11(和平时用的差不多)。C++11的使用,在Dev-cpp工具里面选择编译选项输入-std=c++11并选择编译时加入以下命令。是支持使用unordered_map和auto的,还有__int128。一定要记得return0;去年听说是没return0;......
  • 蓝桥杯,推导部分和
    题意:给定若干个区间端点与区间和,还有若干个查询,求该查询的区间和。思路:带权并查集。总结:区间左端点-1是为了左开右闭(也可以右端点+1)。比如[1,2]=(0,2]=5,[3,4]=(2,4]=6。这样就得到了[1,4]=11(查询1可以直接得到代表元素4),处理边界情况更方便。可以思考一下,如果不......
  • 蓝桥杯2023年A组-试题D-平方差
    0.题目1.题解1.1基于中心扩展的字符串处理算法思路我们可以选定一个中心,然后从中心开始,向外扩展我们的子串,且能存储之前子串的部分性质(这里便于左等于右的情况)0.确定中心点这里我们用外层一个大循环来表示,中心点即为变量i。首先分为子串为奇数串和偶数串的情......
  • 【每周例题】蓝桥杯 C++ 对称排序
    对称排序题目对称排序 题目分析1.因为数字是对称交换,所以我们只需要判断前n/2项需不需要交换就好了2.这里我采用了升序排序,你们也可以尝试降序排序3.我们只需要排序好后再遍历一下整个数组,找出不符合排序的就输出NO就好了代码#include<iostream>#include<bits/stdc+......
  • 第十四届蓝桥杯单片机省赛
    第一部分客观题1.D2.BD3.CA时序逻辑电路是一类具有记忆功能且其输出不仅依赖于当前输入信号,还依赖于电路过去状态的数字电路。常见的时序逻辑电路包括但不限于以下几种类型:1.**触发器**:最基本的存储单元,如RS触发器、JK触发器、D触发器、T触发器等。2.**寄存器**:由多......
  • 蓝桥杯2023年A组-试题C-平方差
    0.题目1.题解1.1数学分析思路主要就是类似剪枝的思想,x必定满足某种条件,我们可以分奇偶情况进行讨论,最后在得出条件后使用暴力枚举.x=(y-z)(y+z)由于奇数±偶数=奇数,偶数±偶数=偶数,奇数±奇数=偶数;可以看出只要y,z的奇偶性质定了,则无论是加减奇......
  • P9231 [蓝桥杯 2023 省 A] 平方差
    因式分解之后发现,满足条件的x要么是奇数,要么是4的倍数#include<iostream>#include<stdio.h>#include<algorithm>#include<string>#include<cmath>#defineR(x)x=read()#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespacestd;......
  • 蓝桥杯
    1.题目2.题解2.1贪心+堆思路由于如下图公式所示:要获取的是最大值(最坏情况),故如果increase增量小于零则没有必要讨论(存在刚开始由于b较大使得增量大于零,而k小于0,后面由于x增大导致增量为负值)可利用贪心局部最优(每次选择加人时,均是选择增量最大的一组),实现全......
  • P9232 [蓝桥杯 2023 省 A] 更小的数
    暴力直接暴力枚举区间,并且逐个判断#include<iostream>#include<stdio.h>#include<algorithm>#include<string.h>#include<string>#include<cmath>#defineR(x)x=read()#defineFor(i,j,n)for(inti=j;i<=n;++i)using......