n阶楼梯,一次走1,2,3步,求多少种不同走法
##已知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步,求多少种不同走法的更多相关文章
- C++练习 | 掷骰子走到第n步的方法数(DFS)
玩家根据骰子的点数决定步数,骰子点数为1的时候走一步,以此类推.求玩家走到第n步总共有多少种投骰子的方法.输入为一个整数n,输出为投骰子的方法数. #include <iostream> ...
- 华为机试题 N阶楼梯的走法,每次走一步或者两步
在Stairs函数中实现该功能: 一个楼梯有N阶,从下往上走,一步可以走一阶,也可以走两阶,有多少种走法? (0<n<=30)<> 例如3阶楼梯有3种走法: 1.1.1 1.2 ...
- 九度OJ 1205 N阶楼梯上楼问题 -- 动态规划(递推求解)
题目地址:http://ac.jobdu.com/problem.php?pid=1205 题目描述: N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用非递归) 输入: 输入包括 ...
- 九度OJ 1205 N阶楼梯上楼问题 (DP)
题目1205:N阶楼梯上楼问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2817 解决:1073 题目描写叙述: N阶楼梯上楼问题:一次能够走两阶或一阶.问有多少种上楼方式. (要 ...
- 华科机考:N阶楼梯上楼
时间限制:1秒空间限制:32768K 题目描述 N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用非递归) 输入描述: 输入包括一个整数N,(1<=N<90). 输出描 ...
- 九度OJ 1205:N阶楼梯上楼问题 (斐波那契数列)
时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:3739 解决:1470 题目描述: N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用非递归) 输入: 输入包括一个整 ...
- 九度oj 题目1205:N阶楼梯上楼问题
题目1205:N阶楼梯上楼问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:4990 解决:2039 题目描述: N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用 ...
- 题目1205:N阶楼梯上楼问题(2008年华中科技大学计算机保研机试真题:递推求解)
题目1205:N阶楼梯上楼问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2447 解决:927 题目描写叙述: N阶楼梯上楼问题:一次能够走两阶或一阶,问有多少种上楼方式. (要求 ...
- 计算机考研复试真题 N阶楼梯上楼问题
题目描述 N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式.(要求采用非递归) 输入描述: 输入包括一个整数N,(1<=N<90). 输出描述: 可能有多组测试数据,对于每组数据 ...
随机推荐
- 【学习笔记】《Python从入门到实践》游戏-Alien Invasion
主模块alien_invasion.py #导入两个库 2 from settings import Settings from ship import Ship import game_functi ...
- centos7.5 修改网卡名称
1.修改网卡配置文件中名称信息 vim /etc/sysconfig/network-scripts/ifcfg-ens33 将其中的名称为ens33的改为eth0 ,并将uuid删除以便后面克隆 2 ...
- jQuery安装和语法
jQuery是一个JavaScript函数库,可实现HTML元素选取及操作.CSS 操作.HTML事件函数.JavaScript特效和动画.HTML DOM遍历和修改.AJAX等功能. 在html中引 ...
- 剑指offer(40)数组中只出现一次的数字
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题目分析 第一种方法:使用js中的indexOf()和lastIndexOf(),只要两个相等, ...
- 剑指offer(58)对称的二叉树
题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 题目分析 主要是要懂得如何去判断对称,比如描述一颗树我们可以通过两个序列就能得 ...
- eclipse Oxygen2 4.7.2版本安装activiti插件,并兼容svn插件
附录,插件下载:链接:https://pan.baidu.com/s/138ChoXao1fALBzdOhJjdQg 密码:06fx 安装方法: 解压eclipse安装包,将eclipse-activ ...
- RPM 包的构建 - SPEC 基础知识
spec 文件 制作 rpm 软件包并不是一件复杂的工作,其中的关键在于编写软件包的 spec 描述文件. 要想制作一个 rpm 软件包就必须写一个软件包描述文件 spec.这个文件中包含了软件包的诸 ...
- 论文笔记:Improving Deep Visual Representation for Person Re-identification by Global and Local Image-language Association
Improving Deep Visual Representation for Person Re-identification by Global and Local Image-language ...
- [原]编译flightGear
参考:flightgear编译博客201705 flightGear是三维飞行仿真软件,这个款软件是开源的,我们尝试用其源码完整编译一遍这个工程,并使用它. 它用到里以下扩展库: 空气动力学库:JSB ...
- R导出图后用AI和PS处理
1)使用pdf()函数导出后,用AI打开,首先是将选中所有要用到的元素,组合为一个文件,然后设置为你最终要的大小,比如你要180mm,那么可以考虑设置为178,因为要留个窄窄的边. 2)然后设置字体和 ...