题目
分析题目
这是典型的动态规划问题,每次可以爬1或2个台阶,让我们求爬到第n阶的方案数,有两种情况,情况一:从n-1阶爬上来。情况二:从n-2阶爬上来;只要把两种情况的方案数相加即可;因此求爬到第n阶的方案数就转换为求爬到第n-1阶和第n-2阶的方案数。
运用动态规划
设计状态:求第n阶的方案数就转移到求第n-1阶和第n-2阶的方案数
写出状态方程:f(n)=f(n-1)+f(n-2);
设定初始状态:f(0)=1; f(1)=1;
执行状态转移
返回最终解
代码段
int climbStairs(int n){
int f[46]={1,1}; //定义一个存放方案数结果的数组,并且设置初始状态
int i;
for(i=2;i<=n;i++)
{
f[i]=f[i-1]+f[i-2]; //执行状态转移
}
return f[n];
}
时间复杂度和空间复杂度分析
代码共执行n-2次,因此时间复杂度为O(n)
定义了一个数组,因此空间复杂度为O(n)
总结
这道题和斐波那契数列简直一模一样,只是换了一个包装