算法題-爬樓梯

爬樓梯問題:

假設你正在爬樓梯。須要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

相關文章
相關標籤/搜索