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)