使用动态规划方法。
假设n=10,从后往前分析,如果只差一步就达到第10层,那么当前必然是在第9层或第8层。
对于前者,走一次一级台阶,就到达,并且只能这样。所以对于前者:从地面到10的走法数量等于从地面到9的走法数量X;
对于后者,不能错误的认为有两种方式到达,即“连续走两次一级台阶”或“走一次二级台阶”,因为第一种走法覆盖了“当前在第9层”的情况,所以也是只能有一种方式。所以对于后者:从地面到10的走法数量等于从地面到8的走法数量Y;
综上,从地面到10的走法数量=X+Y
到第10阶有两种方案,1.从第9阶跳一步;2.从第8阶跳两步,所以到第10阶的跳法等于第9阶的方案+第8阶的方案。
有F[10]=F[9]+F[8]
同理可知F[9]、F[8]...的表达式。
一直到F[1],F[2],可以直接想到F[1]=1,F[2]=2
由此得到解体程序:
class Solution {
public:
int climbStairs(int n) {
int F[50];
F[1]=1;
F[2]=2;
for(int i=3;i<=n;i++)
{
F[i]=F[i-1]+F[i-2];
}
return F[n];
}
};