爬楼梯(非弱化版)

虽然这和我们目前学的东西无关,但我还是要帮助一下有困难的同学。

爬楼梯

时间限制: 2000ms

空间限制: 256000kB

题目描述

一段楼梯有 n 级台阶。你每次可以跨一个、两个或者三个台阶。
请问走上 n 级台阶有几种方案?答案对 998244353 取模。

输入格式

一行一个数 n

输出格式

一行一个数,表示方案数。

样例

Input 1

3

Output 1

4

样例解释

1 + 1 + 1 = 3
1 + 2 = 3
2 + 1 = 3
3 = 3

数据范围

n≤1000

这题其实是一道递推题,但不知道为啥要放在记忆化搜索里……

好,既然知道了这是递推题,那么我们就应该找规律。

\color{purple}\left\{\begin{matrix} \color{red}当n=1时,ans=1 \\ \color{orange}当n=2时,ans=2 \\ \color{brown}当n=3时,ans=4 \\ \color{green}当n=4时,ans=7 \\ \color{blue}当n=5时,ans=13 \\ \color{tan}当n=6时,ans=24 \\ \end{matrix}\right.

我们通过枚举,得出了以上结论。

然后,我们就可以发现,从 4 开始,每项的 ans 都是前面三项的和。

那么,我们只需要定义 Ans_1=1,Ans_2=2,Ans_3=4 ,后面再依次计算即可。

但是,我们会发现一个问题,如果等所有都计算完后再在输出的时候模 998244353 ,会 \color{red}Wrong\space Answer\space\color{black}20 分,但是由于信友队数据不强,开 long\space long 就能过。

但是这肯定不是我们想要的,所以,我们要在循环内就模掉,以保证数据加强时,依然能够 \color{green}Accepted

初始化:

ans[1]=1;ans[2]=2;ans[3]=4;

循环求值:

for(int i=4~n)ans[i]=ans[i-1]+ans[i-2]+ans[i-3],ans[i]%=998244353;

最后输出 Ans_n 即可。

1 个赞

这也太基础了吧,做过这类数学题的都会

】可以用记忆化搜索