因此我们选择用递推解决,同时还有一个问题,题目要求的是菲波那契数列中第
a
a
a个数对
1000
1000
1000取模得到的结果,我们只需要在计算
F
i
b
o
n
a
c
c
i
Fibonacci
Fibonacci数列的时候一边计算一边对
1000
1000
1000取模就可以了,这并不会最终结果
如果我们不一边计算一边取模,而是对单独我们要的那个值进行取模会遇到什么结果?在计算数列的时候就已经爆
i
n
t
int
int、
l
o
n
g
l
o
n
g
long\ long
longlong了,那么在累加求解的过程中就会溢出,最终得到的是负数
其实这道题是动态规划中线性
D
P
DP
DP中非常经典的题目,非常适合新手初步接触动态规划类型题目,从动态规划的四要素来分析该问题
状态表示,
d
p
[
i
]
dp[i]
dp[i]:到达第
i
i
i步台阶的方案数
初始化,
d
p
[
1
]
=
1
dp[1]=1
dp[1]=1,到达台阶一的方案只有一种,那就是直接走一步,
d
p
[
2
]
=
2
dp[2]=2
dp[2]=2,到达台阶二的方案有两种,那就是走两个一步,或者直接走两步,
d
p
[
3
]
=
4
dp[3]=4
dp[3]=4,到达台阶三的方案有四种,要么走四个一步,要么走两个两步,要么先走两步,再走两个一步,要么先走两个一步,再走一个两步
状态转移,
d
p
[
i
]
=
d
p
[
i
−
1
]
+
d
p
[
i
−
2
]
+
d
p
[
i
−
3
]
(
n
>
=
3
)
dp[i]=dp[i-1]+dp[i-2]+dp[i-3](n>=3)
dp[i]=dp[i−1]+dp[i−2]+dp[i−3](n>=3):到达第台阶
i
i
i要么是从第
i
−
1
i-1
i−1步台阶走一步上来的,要么是从第
i
−
2
i-2
i−2步台阶走两步上来的,要么是从第
i
−
3
i-3
i−3步台阶走三步上来的
目标值,要求到达第
n
n
n步台阶方案数,所以直接输出
d
p
[
n
]
dp[n]
dp[n]即可
注意就算最大台阶只有
70
70
70步,但数据增长速度很快,所以需要开
l
o
n
g
l
o
n
g
long \ long
longlong才能通过