動態規劃--斐波那契數列

斐波那契數列定義:

如果按遞歸的方式:


很顯然,會有很多重複,導致時間複雜度成指數級上升。而事實上算過的數沒必要重複計算,比如從下往上計算,根據f(0)和f(1)算出f(2) ,再根據f(1)和f(2)算出f(3)……依此類推就可以算出第n 項了。這樣的時間複雜度是o(n),代碼很容易,不貼了。還有一種通過計算矩陣的n-1次方的方式來計算f(n)的,時間複雜度能達到logn:


但代碼複雜,不適合面試。

能看成是斐波那契數列的問題:

(1)一隻青蛙一次可以跳上1級臺階,也可以跳上2 級。求一隻青蛙跳上一個n 級的臺階總共有多少種跳法。

求解:分爲第一次跳一階和第一次跳兩階兩種情況,所以,f(n)=f(n-1)+f(n-2)。千萬不要當成完全揹包問題處理了。

(2)青蛙跳問題的擴展,在青蛙跳臺階的問題中,如果把條件改成: 一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n 級,此時該青蛙跳上一個n級的臺階總共有多少種跳法?我們用數學歸納法可以證明f(n)=2^(n-1)。 f(n)=2*f(n-1)。當然這不是斐波那契數列了,但是提醒我們要學會用數學歸納法的方式解決問題。

(3)我們可以用2x1(圖2.13 的左邊)的小矩形橫着或者豎着去覆蓋更大的矩形。請問用8 個2x1的小矩形無重疊地覆蓋一個2*8的大矩形(圖2 .1 3的右邊),總共有多少種方法?


分第一個小矩形橫着放和豎着放兩張情況,很快發現這實質上也是一個斐波那契的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章