1. 程式人生 > 其它 >利用動態規劃求解爬樓梯問題

利用動態規劃求解爬樓梯問題

技術標籤:演算法演算法

題目描述:

假設你正在爬樓梯,需要n階才能到達樓頂。每次可以爬1或2階,你有多少種不同的方法可以爬到樓頂呢?其中n是一個正整數。

思路和演算法:

利用動態規劃,用f(x)表示爬到第x級臺階的方案數,考慮到最後一步可能跨越了一級臺階,也可能跨越了兩級臺階,所以我們可以列出如下式子:f(x) = f(x-1)+f(x-2)。它意味著爬到第x-1級臺階的方案數和爬到第x-2級臺階的方案數的和。這裡要統計方案總數,我們就需要對這兩項的貢獻求和。

以上就是動態規劃的轉移方程,下面來確定邊界條件,我們是從第0級開始爬的,所以第0級爬到第0級我們可以看作只有一種方案,即f(0) = 1;從第0級到第一級也只有一種方案,即爬一級,f(1) = 1。這兩個作為邊界條件就可以繼續向後推匯出第n級的正確結果。

演算法java實現:

public int climbStairs(int n) {
    if (n==0||n==1){
        return 1;
    }else{
        return climbStairs(n-1)+climbStairs(n-2);
    }
}

演算法優化:

由於這裡的f(x)只和f(x-1)與f(x-2)有關,所以我們可以用滾動陣列思想把空間複雜度優化成O(1)。

優化後的java實現:

public int climbStairs(int n){
    int p=0,q=0,r=1;
    for(int i=1;<=n;i++){
        p = q;
        q = r;
        r = p + q;
    }
    return r;
}

複雜度分析:

  • 時間複雜度:迴圈執行n次,每次花費常數的時間代價,故時間複雜度為O(n)。
  • 空間複雜度:只用了常數個變數作為輔助空間,故漸進空間複雜度為O(1)。