class Solution {
public:
int climbStairs(int n) {
if(n<=2){
return n;
}
int a=0,b=2,c=1;
for(int i=3;i<=n;i++)
{
a=b+c; //steps[i]=steps[i-1]+steps[i-2],steps[i]表示爬到i位置的方法数目
c=b;
b=a;
}
return a;
}
};
主要用到了动态规划的思想,我们可以站在楼梯顶端想,总共的爬楼梯方法数目应该等于爬到倒数第二层的方法数目加上爬到倒数第一层的数目,因为试想在最后要到达顶端的那一刻,可以有两种方案,要么爬一阶,要么爬两阶。爬一阶就能到达顶端时,假设之前经过了b种方法到达此位置;爬两阶就能到达顶端时,假设之前经过了c种方法到达此位置;那么在奔向顶端的那一刻是不是后面有b+c种爬梯方法。因此到达顶端也就有a=b+c种方法。这是我们在顶端看待问题,那么站在倒数第一层呢,思想还是这样,继续往下呢,......,假设到了第二层,此时有两种方案,到了第一层只有一种方案,然后再回溯往上爬楼梯就可以求出总共的方法数了。