楼梯走法的动态规划算法

  有一座高度是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;
}