青蛙跳台階(動態規劃)

2021-10-05 17:03:07 字數 1995 閱讀 1724

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

這個題採用動態規劃的思想,它每次只能跳一階或者兩階台階;那麼它跳到第n階台階就有兩種情況,從第n-1階台階一次跳一階;或者從n-2階台階一次跳兩階;那麼依次類推,只要保留跳到n-1和n-2的情況就可以算出跳到n的次數;類似於斐波那契數列。

遞迴解法:

class solution 

else

}}

非遞迴解法:

class solution 

return temp;

}};

如果青蛙可以一次跳 1 級,也可以一次跳 2 級,一次跳 3 級,…,一次跳 n 級。問要跳上第 n 級台階有多少種跳法?

要跳上第 n 級台階,可以從第 n−1 級台階一次跳上來,也可以可以從第 n−2 級台階一次跳上來,也可以可以從第 n−3 級台階一次跳上來,…,也可以可以從第 1 級台階一次跳上來。

令 f(n) 表示從第一級台階跳上第 n 級台階有幾種跳法。則有如下遞推公式:

f(n)=f(n−1) + f(n−2)+...+f(1)
同時,f(n−1) 也可以表示如下:

f(n−1)=f(n−2)+f(n−3)+...+f(1)
由上面兩個公式可知:

f(n)=2f(n−1) = ... = 2^(n-1)*f(1) = 2^(n-1)*1

f(n)=2^(n−1)
總結為:

/  1                               n=1

f(n)= 2 n=2

\ 2*f(n-1) = 2^(n-1) n>2

遞迴寫法:

# -*- coding:utf-8 -*-

class

solution

:def

jumpfloorii

(self, number)

:# write code here

if(number <=0)

:return-1

elif

(number ==1)

:return

1else

:return

2*self.jumpfloorii(number-

1)

非遞迴寫法:

# -*- coding:utf-8 -*-

class

solution

:def

jumpfloorii

(self, number)

:# write code here

if number ==1:

return

1elif number ==2:

return

2else

: f =

1 fn =

1# 注意range範圍(0,n+1)

for i in

range(2

,number+1)

: fn =2*f

f = fn

return fn

高度總結寫法:

# -*- coding:utf-8 -*-

class

solution

:def

jumpfloorii

(self, number)

:# write code here

return2**

(number-

1)

動態規劃 1 青蛙跳台階

動態規劃 例子一 乙隻青蛙一次可以跳上1級台階,也可以跳上2級台階。求該青蛙跳上乙個n級台階總共有多少種跳法。分析 第一步 假設台階有7階的話,先從正向分析,假如先跳了一階,那麼還有六階可選,假如先挑了二階,就還有五階可選。所以可以得出,在青蛙做出乙個動作後會有f 7 f 6 f 5 第二步 在青蛙...

動態規劃 青蛙跳台階問題

問題描述 青蛙可以一次跳乙個台階,也可以一次跳兩個台階,總共有10層台階,青蛙有多少種選擇 動態規劃 設第n層的最多選擇為stage n 根據題意,可得如下狀態轉移方程 stage n stage n 1 stage n 2 如果n 10,則上述的意思就是第十層的選擇等於第九層的選擇數 第八層的選擇...

遞迴與動態規劃 青蛙跳台階

本題重點不是怎麼做出來,而是學習如何優化自己的演算法。乙隻 青蛙 一次可以跳上1級台階,也可以跳上2級。求該 青蛙跳上 乙個n級的台階總共有多少種跳法?動態規劃解題的三個步驟 定義dp陣列的含義,其中dp陣列90 是二維陣列,這裡問題比較簡單,是一維。找出陣列元素之間的關係式,即dp n 是可以用d...