问题描述:
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?
这道题如果单纯使用DFS的话会超时,比较好的方法是存一个数组,将第n步到顶的方法数存在数组[n]位置处。
代码如下:0ms
int dfs(int remain,int* store){
if(store[remain]!=-1)
return store[remain];
int tmp1 = dfs(remain-1,store);
int tmp2 = dfs(remain-2,store);
store[remain] = tmp1+tmp2;
return tmp1+tmp2;
}
int climbStairs(int n) {
int* store = (int *)malloc(sizeof(int)*(n+1));
int i;
for(i = 0;i<=n;i++)
store[i] = -1;
store[0] = 1;
store[1] = 1;
int method = dfs(n,store);
free(store);
return method;
}
上面这种方法实在是太蠢了!换成如下:
int climbStairs(int n) {
int* store = (int *)malloc(sizeof(int)*(n+1));
int i;
store[0] = 1;
store[1] = 1;
for(i = 2;i<n;i++){
store[i] = store[i-1]+store[i-2];
}
int tmp = store[n-1]+store[n-2];
free(store);
return tmp;
}