1. 程式人生 > >爬臺階問題(每一次爬一階臺階,或者每一次爬二階臺階)

爬臺階問題(每一次爬一階臺階,或者每一次爬二階臺階)

package leetcode;
/*You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?*/
//為了節省程式的時間複雜度,選擇用最基本的動態規劃方法,就是記憶化搜尋,避免了遞迴對一個問題的重複計算
//爬n接臺階,可以理解為最後一次是爬一個臺階,那麼前面就是n-1階臺階有多少種爬法.最後一次爬兩個臺階,那麼前面就是n-2種爬法

public class Climbing_stairs {
     public static void main(String[] args) {
        System.out.println(climbStairs(3));
    }
     
     public static int climbStairs(int n) {
         if(n == 0)
             return 0;
         if(n == 1)
             return 1;
        int[] a = new int[n+1];     //定義了陣列儲存之前計算過的結果
        a[0] = 1;                     
        a[1] = 1;           //這麼初始化的原因是,兩個臺階可以理解為第一次爬一個臺階,和第一次一個臺階都不怕
                            //也可以選擇初始化a[1]和a[2]
        for(int i = 2 ; i <= n ; i ++ ) {
                a[i] = a[i-1]+a[i-2];         
            }
        return a[n];
     }
}