##已知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. 像素与DPI之间的关系

    先说像素.像素是电子图像组成的基本单位,将图像放大数倍,会发现图像是由一个个“小色块”紧密排列组成的,每一个“小色块”就是一个像素点. 也就是说,每个图像都是由n多个像素点组成. 再说分辨率.所谓分辨 ...

  2. Python RabbitMQ消息持久化

    RabbitMQ消息持久化:就是将队列中的消息永久的存放在队列中.   处理方案: # 在实例化时加入durable=True来确认消息的实例化,客户端服务端都要写 channel.queue_dec ...

  3. 使用Java或 JavaScript获取 方括号中的内容

    1.使用Java获取方括号中的内容 String str = "[你]们,[我]们,[他]们,都要[好好学习,天天敲代码]"; Pattern p = Pattern.compil ...

  4. #const#const int *p 为何可以不初始化

    摘自http://www.myexception.cn/cpp/1900041.html const int *p 为什么可以不初始化?c++ primer 5th   P53 写道:const 对象 ...

  5. nmon 性能监控网页结果显示——EasyNmon

    首先,看看最终展示的结果显示样式: 报告界面: 1.安装包下载地址:https://github.com/mzky/easyNmon 2.下载后有2个压缩文件: 其中,nmon16g_x86中含有不同 ...

  6. python多进程apply与apply_async的区别

    为什么会这样呢? 因为进程的切换是操作系统来控制的,抢占式的切换模式. 我们首先运行的是主进程,cpu运行很快啊,这短短的几行代码,完全没有给操作系统进程切换的机会,主进程就运行完毕了,整个程序结束. ...

  7. 安装xampp出错,windows找不到-n ?

    安装xampp出错,windows找不到-n ? https://www.zhihu.com/question/47248695/answer/105042516 尝试解决步骤 1.安装Microso ...

  8. cmd 查看端口

    windows + R 调出cmd窗口 输入 netstat -nao 查看端口使用情况 输入netstat -nao | findstr 80查找指定端口 杀死指定端口的进程taskkill /pi ...

  9. POJ 1088 滑雪(模板题 DFS+记忆化)

    Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...

  10. bootStrap table 和 JS 开发过程中遇到问题汇总

    1..bootStrap-table表头固定 在table定义的时候给高度属性就可以自动生成滚动条,并且固定表头[height: 220,] 2.为动态生成的DOM元素绑定事件 on("cl ...