動態規劃-008-跳臺階

跳臺階問題

題目描述

一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。

分析

完全同 Fibonacci 數列

確定狀態轉移公式

階段定義:跳n階臺階需要總可能跳法爲 f(n)。

那調到第n階臺階的最後一步跳法無非是從第n-1階臺階跳一步上去的,或者從第n-2階臺階跳兩階上去的。即得狀態轉移公式:

f(n)=f(n1)+f(n2)f(n) = f(n-1)+f(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)。

f(n)=f(n1)+f(n2)+......+f(2)+f(1)+1f(n) = f(n-1)+f(n-2)+......+f(2)+f(1)+1
         =21(f(n2)+......+f(2)+f(1)+1)~~~~~~~~~=2^1(f(n-2)+......+f(2)+f(1)+1)
         =22(f(n3)+......+f(2)+f(1)+1)~~~~~~~~~=2^2(f(n-3)+......+f(2)+f(1)+1)
         =......~~~~~~~~~=......
         =2(n3)(f(2)+f(1)+1)~~~~~~~~~=2^{(n-3)}(f(2)+f(1)+1)
         =2(n3)(2+1+1)~~~~~~~~~=2^{(n-3)}(2+1+1)
         =2(n1)~~~~~~~~~=2^{(n-1)}

代碼

# -*- coding:utf-8 -*-
class Solution:
    def jumpFloorII(self, number):
        # write code here
        return pow(2, number-1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章