假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。1 阶 + 1 阶2 阶
示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。1 阶 + 1 阶 + 1 阶1 阶 + 2 阶2 阶 + 1 阶
提示:
1 <= n <= 45
递归超出时间限制
#include#include int climbStairs(int n){ if(n<0) return 0; if(n==1) return 1; if(n==2) return 2; return climbStairs(n-1)+climbStairs(n-2); } int main(int argc, char *argv[]) { int n; scanf("%d",&n); printf("%d",climbStairs(n)); return 0; }
记忆化递归(找一个一维数组将重复计算的结果存储起来)
#include动态规划#include int m[50]; int climbStairs(int n){ int res; if(n<0) return 0; if(m[n]!=0) return m[n]; else { res = climbStairs(n-1)+climbStairs(n-2); return res; } } int main(int argc, char *argv[]) { int n,i; for(i=0;i<50;i++) m[i]=0; m[1]=1;m[2]=2; scanf("%d",&n); printf("%d",climbStairs(n)); return 0; }
int climbStairs(int n){
int prepre=1,pre=2,i=0;
int res;
if(n==1) return 1;
if(n==2) return 2;
for(i=3;i<=n;i++)
{
res = prepre+pre;
prepre=pre;
pre=res;
}
return res;
}
三阶扩展
如果是一次只能上1阶或3阶楼梯。
#include#include int m[50]; int climbStairs(int n){ int res; if(n<0) return 0; if(m[n]!=0) return m[n]; else { res = climbStairs(n-1)+climbStairs(n-3); return res; } } int main(int argc, char *argv[]) { int n,i; for(i=0;i<50;i++) m[i]=0; m[1]=1;m[2]=1;m[3]=2; scanf("%d",&n); printf("%d",climbStairs(n)); return 0; }
#include#include int climbStairs(int n){ int res,i; int prepre=1,pre=1,preafter=2; if(n==1 || n==2) return 1; if(n==3) return 2; for(i=4;i<=n;i++) { res = prepre+preafter; prepre=pre; pre=preafter; preafter=res; } return res; } int main(int argc, char *argv[]) { int n,i; scanf("%d",&n); printf("%dn",climbStairs(i)); return 0; }



