zoukankan      html  css  js  c++  java
  • HDU2041 超级楼梯

    问题链接HDU2041 超级楼梯基础训练题,用C语言编写程序。

    问题简述参见上述链接。

    问题分析:这是一个递推的问题。站在楼梯的第n级想一下,前一步是从哪里来的,问题就清楚了。

    由于每次只能上一级或两级,那么f(n)=f(n-2)+f(n-1)。这不就是一个菲波拉契数列吗?就是一个递推问题?

    可是,开始时候是站在第1级台阶上,所以数列的开始几项会有所不同。

    f(1)=0,因为开始就站在第1级台阶上;

    f(2)=1,只能从第1级台阶上1级;

    f(3)=2,只能从第1级台阶上2级,或只能从第2级台阶上1级;

    f(n)=f(n-2)+f(n-1),n>3。

    得到上述递推关系后,便写了一个函数来计算f(n),程序如下:

    unsigned long long fib(int n)
    {
        if(n == 1)
            return 0;
        else if(n == 2)
            return 1;
        else if(n == 3)
            return 2;
        else
            return fib(n-2) + fib(n-1);
    }

    一用这个函数来解决问题,时间上就爆了。

    先打表,问题就解决了。

    程序说明(略)

    AC的C语言程序如下:

    /* HDU2041 超级楼梯 */
    
    #include <stdio.h>
    
    #define MAXN 40
    
    typedef unsigned long long ULL;
    
    ULL fn[MAXN+1];
    
    void setfn()
    {
        int i;
    
        fn[1] = 0;
        fn[2] = 1;
        fn[3] = 2;
        for(i=4; i<=MAXN; i++)
            fn[i] = fn[i-2] + fn[i-1];
    }
    
    int main(void)
    {
        int n, m;
    
        // 先打表
        setfn();
    
        scanf("%d", &n);
        while(n--) {
            scanf("%d", &m);
            printf("%lld
    ", fn[m]);
        }
    
        return 0;
    }


  • 相关阅读:
    xrange和range区别
    bool([x]) 将x转换为Boolean类型
    bin(x) 将整数x转换为二进制字符串
    chr(i) 返回整数i对应的ASCII字符
    音乐欣赏
    迅雷下载百度云引发的“事故”
    swift获取图片路径出错
    记号笔写在白板上引起的尴尬而又无奈的事件
    swift 3新特性总结
    watch
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564648.html
Copyright © 2011-2022 走看看