This problem was asked by Amazon.
There exists a staircase with N steps, and you can climb up either 1 or 2 steps at a time. Given N, write a function that returns the number of unique ways you can climb the staircase. The order of the steps matters.
For example, if N is 4, then there are 5 unique ways:
1, 1, 1, 1
2, 1, 1
1, 2, 1
1, 1, 2
2, 2
What if, instead of being able to climb 1 or 2 steps at a time, you could climb any number from a set of positive integers X? For example, if X = {1, 3, 5}, you could climb 1, 3, or 5 steps at a time.
典型的动态规划。首先确定dp数组定义,即爬i层楼梯有dp[i]种方法;然后思考递推公式dp[i] = dp[i-1] + dp[i-2]。其中dp[1]=1, dp[2]=2。
class Solution {
public:
int climbStairs(int n) {
if (n <= 1) return n;
vector<int> dp(n + 1);
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) { // 注意i是从3开始的
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
};
对于follow-up的问题,递推公式稍稍变化即可。
class Solution {
public:
int climbStairs(int n, vector<int> X) {
if (n <= 1) return n;
vector<int> dp(n + 1);
dp[0] = 1;
for (int i = 1; i <= n; i++) { // 注意i是从2开始的
for(int j:X){
if(i>=j) dp[i] += dp[i-j]
}
}
return dp[n];
}
};