数据结构与算法(7)-练习

311 阅读1分钟

一.爬楼梯

假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?(n是一个正整数)

分析:

假设爬 n 个台阶有f(n)个可能:

  1. 假设先爬1阶, 剩下n-1阶有f(n-1)种可能
  2. 假设先爬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];
}