乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法(先後次序不同算不同的結果)。
這個題採用動態規劃的思想,它每次只能跳一階或者兩階台階;那麼它跳到第n階台階就有兩種情況,從第n-1階台階一次跳一階;或者從n-2階台階一次跳兩階;那麼依次類推,只要保留跳到n-1和n-2的情況就可以算出跳到n的次數;類似於斐波那契數列。
遞迴解法:
非遞迴解法:class solution
else
}}
如果青蛙可以一次跳 1 級,也可以一次跳 2 級,一次跳 3 級,…,一次跳 n 級。問要跳上第 n 級台階有多少種跳法?class solution
return temp;
}};
要跳上第 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...