此题其实和斐波那契数列是一样的思路,关键在于如何进行转化。不要从开始考虑,考虑第n个点,有可能由n-1跳一步过来或者n-2跳两步过来。所以得到递推式
f
(
n
)
=
f
(
n
−
1
)
+
f
(
n
−
2
)
f(n) = f(n-1) + f(n-2)
f(n)=f(n−1)+f(n−2)
然后我们从前往后dp计算即可。
class Solution:
def numWays(self, n: int) -> int:
MOD = 1000000007
a, b = 1, 1 # 存的是0, 1的值
for i in range(n):
a, b = b, (a+b)%MOD
return a
进阶问题:如果青蛙能一次爬1-n级台阶,爬到n层有多少可能?
考虑递推式:
f
(
n
)
=
f
(
n
−
1
)
+
f
(
n
−
2
)
+
.
.
.
+
f
(
1
)
+
f
(
0
)
f(n) = f(n-1) + f(n-2) + ... + f(1) + f(0)
f(n)=f(n−1)+f(n−2)+...+f(1)+f(0)
可以看出第n个等于前面所有的和。咱们找下规律:从0到4分别是1, 1, 2, 4, 8, 16 …
可以看出,从小到大相加都会是2的指数,所以是
2
n
−
1
2^{n-1}
2n−1种可能性。