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;
    }


  • 相关阅读:
    宋体、新宋体、仿宋体
    单例模式————你就是我的唯一
    极乐净土代码——第一辑
    泛函是个什么概念
    http和https的区别
    get和post的区别
    浏览器输入URL按回车后都经历了什么?
    求两个列表的交集、并集、差集
    使用lamdba函数对list排序
    乐观锁和悲观锁的区别
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564648.html
Copyright © 2011-2022 走看看