算法题-爬楼梯

爬楼梯问题:

假设你正在爬楼梯。须要n阶你才能到达楼顶。每次你能够爬1或2个台阶。你有多少种不一样的方法能够爬到楼顶呢?

已知条件分析:

  • n = 1; [1]=>1种
  • n = 2; [1,1] [2]=>2种
  • n = 3; [1,1,1] [1,2] [2,1]=>3种
  • n = 4; [1,1,1,1] [1,2,1] [1,1,2] [2,1,1] [2,2]=>5种
  • n = 5; [1,1,1,1,1] [2,1,1,1] [1,2,1,1] [1,1,2,1] [1,1,1,2] [1,2,2] [2,1,2] [2,2,1]=>8种
  • ......

求的是斐波那契数列的和=》1 + 2 + 3 + 5 + 8 + 13 + .... + n算法

递归方式

int recursiveFbi(int n) {
    if (n == 1 || n == 2) {
        return n;
    } else {
        return recursiveFbi(n - 1) + recursiveFbi(n - 2);
    }
}
复制代码

动态规划

int Fbi(int n) {
    int *a = (int*)malloc(sizeof(int) * n);
    a[0] = 1;
    a[1] = 2;
    for (int i = 2; i < n; i++) {
        a[i] = a[i-1] + a[i-2];
    }
    
    int ret = a[n-1];
    
    free(a);
    return ret;
}
复制代码

当我动态规划写完,发现空间还能够再优化一下markdown

动态规划-空间优化

int Fbi2(int n) {
    int a1 = 1;
    int a2 = 2;
    int a3 = 0;
    for (int i = 2; i < n; i++) {
        a3 = a2 + a1;
        a1 = a2;
        a2 = a3;
    }
    
    int ret = a3;
    
    return ret;
}
复制代码

运行

int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, Fbi!\n");
    
    int n = 10;
    printf("递归:%d层楼梯有%d种方法\n", n , recursiveFbi(n));
    printf("动态规划:%d层楼梯有%d种方法\n", n , Fbi(n));
    printf("动态规划-空间优化:%d层楼梯有%d种方法\n", n , Fbi2(n));
    
    return 0;
}
复制代码

传送门

算法题-杨辉三角post

相关文章
相关标签/搜索