【基础训练】HDOJ2041超级楼梯

来源:互联网 发布:江西淘宝大学 编辑:程序博客网 时间:2024/05/21 09:18

这是一个水题,但是却花费了我一些功夫来研究,所以将其记录下来。刚开始看到题目的时候,我脑袋是晕的,当我试着将前几级楼梯的不同走法计算了一下,发现这不是斐波拉契数列嘛,把自己包装的这么严实。一想到斐波拉契数列就想到了递归,因此我就写了个递归,提交之后,结果超时。递归需要一层层的将结果计算出来,因此有可能同一结果要计算很多遍这样就会很浪费时间。因此,我就想用一个数组将计算结果保存起来,如果数组里面已经保存了其值,则直接用于计算,就免除了重新计算消耗的时间了。

#include <stdio.h>int a[45] = {0};int f(int n){    if(a[n-1] && a[n-2])        return a[n-1]+a[n-2];    else    {        if(n == 2)        {            a[2] = 1;            return a[2];        }        if(n == 3)        {            a[3] = 2;            return a[3];        }        a[n] = f(n-1)+f(n-2);        return a[n];    }}int main(){    int n,M,i,cou;    scanf("%d",&M);    for(i = 0;i <M;i++)    {        cou = 0;        scanf("%d",&n);        cou = f(n);        printf("%d\n",cou);    }    return 0;}


0 0