1. 程式人生 > >樓梯走法的動態規劃演算法

樓梯走法的動態規劃演算法

  有一座高度是10級臺階的樓梯,從下往上走,第步只能向上走1級或者2級,求一共有多少種走法?

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int *memo = NULL;
int steps = 10;

//普通遞迴求解
int stage(int n) {
    if (n == 1) {
        return 1;
    }

    if (n == 2) {
        return 2;
    }

    return stage(n-1) + stage(n-2);
}

//備忘錄演算法
int init_memo() {
    memo = (int*)malloc(sizeof(int));
    if (memo == NULL) {
        fprintf(stderr, "error on malloc\n");
        exit(EXIT_FAILURE);
    }

    for(int i=0; i<steps; i++) {
        memo[i] = -1;
    }

    return 0;
}

void free_memo() {
    if (memo != NULL) {
        free(memo);
    }
}

int memo_stage(int n) {
    int l,r;

    if (n == 1) {
        memo[n] = 1;
        return 1;
    }

    if (n == 2) {
        memo[n] = 2;
        return 2;
    }

    if (memo[n-1] > 0) {
        l = memo[n-1];
    } else {
        l = memo_stage(n-1);
       memo[n-1] = l;
    }


    if (memo[n-2] > 0) {
        r = memo[n-2];
    } else {
        r = memo_stage(n-2);
        memo[n-2] = r;
    }

    return l+r;
}

int main(int argc, char* argv[]) {
    printf("%d\n", stage(steps));

    init_memo();
    printf("%d\n", memo_stage(steps));
    free_memo();

    return 0;
}