1. 程式人生 > >leetcode的python實現 刷題筆記70:爬樓梯(動態規劃)

leetcode的python實現 刷題筆記70:爬樓梯(動態規劃)

假設你正在爬樓梯。需要 n 階你才能到達樓頂。

每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?

注意:給定 n 是一個正整數。

示例 1:

輸入: 2
輸出: 2
解釋: 有兩種方法可以爬到樓頂。
1.  1 階 + 1 階
2.  2 階

示例 2:

輸入: 3
輸出: 3
解釋: 有三種方法可以爬到樓頂。
1.  1 階 + 1 階 + 1 階
2.  1 階 + 2 階
3.  2 階 + 1 階
class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        current = [0] * (n + 1)
        current[0] = 1
        current[1] = 1
        for i in range(2, n + 1):
            current[i] = current[i - 1] + current[i - 2]
        return current[n]

sl = Solution()
print(sl.climbStairs(3))
print(sl.climbStairs(5))
print(sl.climbStairs(7))
print(sl.climbStairs(9))

思路:

1.由題目我們可以知道,當你爬到第n個樓梯的時候,你有兩種選擇,第一種是從第n-1個樓梯上走1個樓梯,第二種是從第n-2個樓梯上走2個樓梯.因此我們可以得到這樣的一個式子:f(n)=f(n-1)+f(n-2)。

2.所以我們可以定義一個長度為n+1的陣列,用來存放不同的數字相對應的解決方案,這裡要注意的是當樓梯長度等於0或者1 的時候我們都看作是隻有一種走法。

總結:

1.斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……在數學上,斐波納契數列以如下被以遞推的方法定義:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)

2.儘量不使用遞迴的方法,因為遞迴會佔用過多的儲存空間和執行時間。

3.所有遞迴的方法都可以轉化成非遞迴的方法,也就是動態規劃

4.動態規劃:通過把大問題分解為相對簡單的子問題的方式求解複雜問題的方法。適用於有重疊子問題和最優子結構性質的問題

5.思想:將大問題分解成小問題,然後合併小問題的解,進而得到大問題的解。實際上就是解決了小問題之後,把小問題的解儲存成一個表,當要使用的時候就查表,直接呼叫之前的到的結果。

6.動態規劃和分治法的思想很類似,都是把化大為小,逐個擊破。區別在於分治法分成的小問題都是相互獨立的,需採用遞迴的做法,而動態規劃分成的小問題之間有一定的聯絡,可以通過查詢來直接使用。