LeetCode70——Climbing Stairs
题意:
爬楼梯你可以爬一步或者两步,求你到终点时有多少种可能。
首先假设终点是3
则你可以:
1.先跳两步再跳一步
2.先跳一步再跳两步
3.先跳一步,再跳一步,再跳一步。
1和3这两种情况都要经过第二个台阶。
第2种情况要经过第一个台阶。
那么到达第3个台阶需要可能的组合就是3种,分别是经过第1级台阶和经过第2级台阶的个数的和。
根据此,推断写出动归方程:
dp[i] = dp[i-1] + dp[i-2]
虽然说不清为什么,但这就是一个斐波那契数列的递推关系。。。
代码:
class Solution {
private:
void helper(vector<int>&dp,int n)
{
int i = 3;
while (i <= n)
{
dp[i] = dp[i - 1] + dp[i - 2];
i++;
}
}
public:
int climbStairs(int n) {
vector<int>dp(n+1);
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
helper(dp, n);
return dp[n];
}
};