# -*- coding:utf-8 -*-classSolution:defFibonacci(self, n):# write code here
f =[1for i inrange(40)]
f[0]=0for i inrange(3,40):
f[i]= f[i-1]+f[i-2]return f[n]
跳台阶 由于一只青蛙一次可以跳上1级台阶,也可以跳上2级,所以如果到第i级台阶总共有两种跳法,一种是从第(i-1)级台阶跳上来,另一种是从第(i-2)级台阶跳上来,所以到第i级台阶的跳法总和就是到第(i-1)和第(i-2)级台阶的跳法的总和,即
d
p
[
i
]
=
d
p
[
i
−
1
]
+
d
p
[
i
−
2
]
dp[i]=dp[i-1]+dp[i-2]
dp[i]=dp[i−1]+dp[i−2] 是不是和上一题的那个公式很像,不过这道题与上道题略有不同。上道题的0位置的值为0,而本题的0位置的值为1,所以后面位置的值相应改变。
# -*- coding:utf-8 -*-classSolution:defjumpFloor(self, number):# write code here
dp =[1,1]for i inrange(2, number+1):
dp.append(dp[i-1]+dp[i-2])return dp[number]
变态跳台阶 这道题是跳台阶问题的升级版。由于一步可以跳1到n个台阶,所以到第n个台阶有n种跳法,分别是从第0到第(n-1)节台阶开始跳。即:
d
p
[
i
]
=
∑
j
=
0
i
−
1
d
p
[
j
]
dp[i]=\sum_{j=0}^{i-1}{dp[j]}
dp[i]=j=0∑i−1dp[j] 而此时注意到
d
p
[
i
−
1
]
=
∑
j
=
0
i
−
2
d
p
[
j
]
dp[i-1]=\sum_{j=0}^{i-2}{dp[j]}
dp[i−1]=j=0∑i−2dp[j] 所以
d
p
[
i
]
=
2
d
p
[
i
−
1
]
dp[i]=2dp[i-1]
dp[i]=2dp[i−1] 而由于dp[0]=1,dp[1]=1,dp[2]=2,可知:
d
p
[
i
]
=
2
i
−
1
dp[i]=2^{i-1}
dp[i]=2i−1 思考:python中
k
n
k^n
kn用k**n表示
# -*- coding:utf-8 -*-classSolution:defjumpFloorII(self, number):# write code hereif number ==0:return1return2**(number-1)