给定一个n阶数的梯子,每步可以跨1或者2阶,问最终上去的不同方法:
分析:
当阶数n=1,只有1种方法;
当阶数n=2,有两种方法;
当阶数n=3,其方法种数等于n=2的种数(剩下的1阶一步即可到达),再加上n=1的种树(剩下的2阶明显可以到达);
当阶数n,其方法种数等于n-2的种数(剩下的2阶一步即可到达),再加上n11的种树(剩下的1阶明显可以到达);
很容易知道是递归:
int climbStairs(int n) {
if(n==1)return 1;
if(n==2)return 2;
return climbStairs(n-1)+climbStairs(n-2);
}
提交后超时,这是递归的缺点所在,改为动态规划:
int climbStairs1(int n) {
vector<int> a(n+1);
a[0]=a[1]=1;
int i;
for(i=2;i<=n;i++)
a[i]=a[i-1]+a[i-2];
return a[n]; }