跳臺階問題
題目描述
一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。
分析
完全同 Fibonacci 數列。
確定狀態轉移公式
:
階段定義:跳n階臺階需要總可能跳法爲 f(n)。
那調到第n階臺階的最後一步跳法無非是從第n-1階臺階跳一步上去的,或者從第n-2階臺階跳兩階上去的。即得狀態轉移公式:
注意
:
動態規劃自底向上解決問題時本身需要維護最優表
,但是一維的動態規劃
狀態轉移方程f(n)
狀態只與緊接着的前兩個狀態有關
,所以可以維護一維的最優表替換成
維護兩個變量
即可。將空間複雜度降低成常數級
。
代碼
# 自底向上
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.dp = []
def jumpFloor(self, number):
self.dp = [0]*number
self.dp[0] = 1
if number == 1:
return 1
self.dp[1] = 2
for i in range(2,number):
self.dp[i] = self.dp[i-1] + self.dp[i-2]
return self.dp[number-1]
變態跳青蛙
題目描述
一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
分析
確定狀態轉移公式
:
階段定義:跳n階臺階需要總可能跳法爲 f(n)。
代碼
# -*- coding:utf-8 -*-
class Solution:
def jumpFloorII(self, number):
# write code here
return pow(2, number-1)