You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
Dynamic Programming
思路:回溯法直接求解
class Solution {
public:
int count=0;
void function(int i,int num)
{
if(i>num)
count++;
else{
function(i+1,num);
if(i+1<=num)
function(i+2,num);
}
}
int climbStairs(int n) {
function(1,n);
return count;
}
};
Status:
Time Limit Exceeded
下面进行优化
考虑climbStairs(n+1)与climbStairs(n)有何关系??
用第n+1个台阶来划分,有两种情况:
1)第n+1个台阶最后一个爬
2)第n+1个台阶和第n个台阶一起爬
这样,1)中可能的情况就是climbStairs(n)种
2)中第n+1个台阶和第n个台阶划分到了一起,那么前面还有n-1个台阶,那么可能的情况就是climbStairs(n-1)种
因此 climbStairs(n+1)=climbStairs(n)+climbStairs(n-1)
class Solution {
public:
int climbStairs(int n) {
if(n<=2)
return n;
int *result=new int[n+1];
memset(result,0,sizeof(int)*(n+1));
result[1]=1;
result[2]=2;
for(int i=3;i<=n;i++)
result[i]=result[i-1]+result[i-2];
return result[n];
}
};