##已知n阶楼梯,一次可以迈1,2,3步。求所有走法
## 如果要列出走法,时间复杂度太高,O(n)=2**n,前两个函数遍历走法。
## 如果只是单纯列出走法数量,就简单多了,也但是很容易内存爆表。

## n层走法,可以视为n-1层再走一步,n-2层走两步,n-3层走三步。题目都可以按这个思路解决
import copy,time
lv=5
n1=1000000
fzd=0
lg=[]
if lv<=1:
    def dg(ln,n,l):
        global fzd
        fzd+=1
        if ln<n:
            l1=l[:]+[1]
            l2=l[:]+[2]
            l3=l[:]+[3]
            return dg(ln+1,n,l1),dg(ln+2,n,l2),dg(ln+3,n,l3)
        if ln==n:
            return lg.append(l)
    
    ##for j in range(10):
    ##    dg(0,j,[])
    ##    print(len(lg))
    ##    lg=[]
    t=time.time()
    dg(0,n1,[])
    print('dg1 %s阶用时%s s,时间复杂度%s'%(str(n1),str(time.time()-t),fzd))
    lg=[]
    fzd=0
## 另一种递归 可以将n阶台阶分解为走一步+n-1阶,走两步+n-2阶,走三步+n-3阶
## 时间复杂度太高了。
if lv<=2:
    def dg2(n):
        global fzd
        for i in range(1,n+1):
            if i==1:
                lg.append([[1]])
            elif i==2:
                lg.append([[1,1],[2]])
            elif i==3:
                lg.append([[1, 1, 1],[1, 2],[2, 1],[3]])
            else:
                ##深拷贝耗时太长
                ##ln1,ln2,ln3=copy.deepcopy(lg[-1]),copy.deepcopy(lg[-2]),copy.deepcopy(lg[-3])
                ln1,ln2,ln3=lg[-1],lg[-2],lg[-3]
                for j in ln3:
                    fzd+=1
                    j.append(3)
                for j in ln2:
                    fzd+=1
                    j.append(2)
                for j in ln1:
                    fzd+=1
                    j.append(1)     
                lg.append(ln3+ln2+ln1)
        return lg
    t=time.time()
    dg2(n1)
    print('dg2 %s阶用时%s s,时间复杂度%s'%(str(n1),str(time.time()-t),fzd))
    lg=[]
    fzd=0
    ##print(len(lg[-1]))
    ##for n,i in enumerate(lg):
    ##    print('第%s次展示:'%(n+1))
    ##    for j in i:
    ##        print(j)

#### 只计数
## 正面横推
if lv<=3:
    def dgcount(n):
        for i in range(1,n+1):
            if i==1:
                lg.append(1)
            elif i==2:
                lg.append(2)
            elif i==3:
                lg.append(4)
            else:
                lg.append(lg[-3]+lg[-2]+lg[-1])
        return lg

t=time.time()
    dgcount(n1)
    print('dgcount %s阶用时%s s'%(str(n1),str(time.time()-t)))

## 反向递推
if lv<=4:
    def dgcount2(n):
        if n==1:
            return 1
        elif n==2:
            return 2
        elif n==3:
            return 4
        else:
            return dgcount2(n-1)+dgcount2(n-2)+dgcount2(n-3)

t=time.time()
    dgcount2(n1)
    print('dgcount2 %s阶用时%s s'%(str(n1),str(time.time()-t)))
## 正面横推2
if lv<=5:
    def dgcount3(n):
        if n>3:
            num1=4
            num2=2
            num3=1
        elif n==1:
            return 1
        elif n==2:
            return 2
        elif n==3:
            return 4
        for i in range(4,n+1):
            num1,num2,num3=num1+num2+num3,num1,num2
        return num1

t=time.time()
    dgcount3(n1)
    print('dgcount3 %s阶用时%s s'%(str(n1),str(time.time()-t)))

n阶楼梯,一次走1,2,3步,求多少种不同走法的更多相关文章

  1. C++练习 | 掷骰子走到第n步的方法数(DFS)

    玩家根据骰子的点数决定步数,骰子点数为1的时候走一步,以此类推.求玩家走到第n步总共有多少种投骰子的方法.输入为一个整数n,输出为投骰子的方法数. #include <iostream> ...

  2. 华为机试题 N阶楼梯的走法,每次走一步或者两步

    在Stairs函数中实现该功能: 一个楼梯有N阶,从下往上走,一步可以走一阶,也可以走两阶,有多少种走法? (0<n<=30)<> 例如3阶楼梯有3种走法: 1.1.1 1.2 ...

  3. 九度OJ 1205 N阶楼梯上楼问题 -- 动态规划(递推求解)

    题目地址:http://ac.jobdu.com/problem.php?pid=1205 题目描述: N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用非递归) 输入: 输入包括 ...

  4. 九度OJ 1205 N阶楼梯上楼问题 (DP)

    题目1205:N阶楼梯上楼问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2817 解决:1073 题目描写叙述: N阶楼梯上楼问题:一次能够走两阶或一阶.问有多少种上楼方式. (要 ...

  5. 华科机考:N阶楼梯上楼

    时间限制:1秒空间限制:32768K 题目描述 N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用非递归) 输入描述: 输入包括一个整数N,(1<=N<90). 输出描 ...

  6. 九度OJ 1205:N阶楼梯上楼问题 (斐波那契数列)

    时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:3739 解决:1470 题目描述: N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用非递归) 输入: 输入包括一个整 ...

  7. 九度oj 题目1205:N阶楼梯上楼问题

    题目1205:N阶楼梯上楼问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:4990 解决:2039 题目描述: N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用 ...

  8. 题目1205:N阶楼梯上楼问题(2008年华中科技大学计算机保研机试真题:递推求解)

    题目1205:N阶楼梯上楼问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2447 解决:927 题目描写叙述: N阶楼梯上楼问题:一次能够走两阶或一阶,问有多少种上楼方式. (要求 ...

  9. 计算机考研复试真题 N阶楼梯上楼问题

    题目描述 N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用非递归) 输入描述: 输入包括一个整数N,(1<=N<90). 输出描述: 可能有多组测试数据,对于每组数据 ...

随机推荐

  1. Navicate 连接mysql问题

    mysql8.0 and Navicate11.2 链接报错问题 亲测有效:记录一下仅供提醒自己 原创: https://blog.csdn.net/xdmfc/article/details/802 ...

  2. P3371 【模板】单源最短路径(弱化版)(Dijkstra算法)

    题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来M行每行包含三 ...

  3. javadate相关

    /** * 根据年月获取对应的天数 */ int getDaysByYearMonth(int year, int month) { Calendar a = Calendar.getInstance ...

  4. Redis学习-hash数据类型

    hash 类型是string类型的field和value的映射表,或者说是一个string集合,适合存储对象,相比较而言,将一个对象类型存储在hash类型里要比存储在string类型里占用更少的内存空 ...

  5. PHP5.6 Dockerfile

    FROM centos COPY ["src","/src"] RUN groupadd -g 1000 www \ && useradd -u ...

  6. 国服最强JWT生成Token做登录校验讲解,看完保证你学会!

    转载于:https://blog.csdn.net/u011277123/article/details/78918390 Free码农 2017-12-28 00:08:02 JWT简介 JWT(j ...

  7. msf下的各种生成payload命令

    Often one of the most useful (and to the beginner underrated) abilities of Metasploit is the msfpayl ...

  8. 解决使用eclipse创建maven web项目时报Could not resolve archetype的问题

    前两天重装了系统,今天想写一个项目的时候出现了点问题. 在使用eclipse创建maven web项目时,点Finish后报了Could not resolve archetype的问题. Could ...

  9. EJB到底是什么?

    EJB到底是什么?   1. 我们不禁要问,什么是"服务集群"?什么是"企业级开发"? 既然说了EJB 是为了"服务集群"和"企业 ...

  10. centos6.5下安装tomcat

    linux在安装tomcat之前必须已安装jdk 已下载好tomcat 拖到centos系统的桌面 现在在桌面目录下 mv apache-tomcat-8.5.39.tar.gz /usr/local ...