一.爬楼梯
假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?(n是一个正整数)
分析:
假设爬 n 个台阶有f(n)个可能:
- 假设先爬1阶, 剩下n-1阶有
f(n-1)种可能 - 假设先爬2阶,剩下n-2阶有
f(n-2)种可能 因此爬n阶可以转化成2种爬n-1问题的和.f(n) = f(n-1) + f(n-2)
- 递归解法:
int ClimbStairs_1(int n){
if (n<= 2) return n;
return ClimbStairs_1(n-1) + ClimbStairs_1(n-2);
}
- 动态规划法
不同于递归解法,主要原理是从1->n,记录爬到每层台阶可能的方法,然后到达n层可能的次数
sum(n),就是sum(n-1)+sum(n-2),此时直接求出sum(n),效率非常高效
int ClimbStairs(int n){
if(n==1) return 1;
int temp = n+1;
int *sum = (int *)malloc(sizeof(int) * (temp));
sum[0] = 0;
sum[1] = 1;
sum[2] = 2;
for (int i = 3; i <= n; i++) {
sum[i] = sum[i-1] + sum[i-2];
}
return sum[n];
}