【LintCode】Climbing Stairs(筆記)

Description

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?

Example

Given an example n=3 , 1+1+1=2+1=1+2=3

return 3

Notes

這題開始沒懂是要幹什麼,看到tag裏的動態規劃(Dynamic Programming)和別人的分析,才明白了題意。表面上看是求加和到n能有幾種方案,換種方式理解,爬梯子爬到第n層有兩種路徑,一種是從n-1層爬1步,一種是從n-2層爬2步,所以dp[n]=dp[n-1]+dp[n-2];而爬到n-1層的方案數是dp[n-1],爬到n-2層的方案數是dp[n-2];這樣就能看出遞歸的趨勢了。

。。。所以它居然和斐波那契數列有些像,開始真是沒明白題意

Solution

class Solution {
public:
    /**
     * @param n: An integer
     * @return: An integer
     */
    int climbStairs(int n) {
        // write your code here
        int *dp = new int[n+1];
        dp[0] = 1;
        dp[1] = 1;
        for(int i=2; i<=n; i++){
            dp[i] = dp[i-1] + dp[i-2];
        }
        return dp[n];
    }
};

其實原先寫的是

 

 

    int climbStairs(int n) {
        // write your code here
        if(n>=2)
            return n;
        int *dp = new int[n+1];
        dp[0] = 1;
        dp[1] = 1;
        for(int i=2; i<=n; i++){
            dp[i] = dp[i-1] + dp[i-2];
        }
        return dp[n];
    }

這樣dp[0]=0了,不通過。。。
(雖然AC了,但仍不理解爲什麼dp[0]=1)

 


 

發佈了71 篇原創文章 · 獲贊 98 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章