一次可以走1或者2步,N级楼梯有多少种走法?

一个人爬楼梯,一步可以迈一级,二级,三级台阶,如果楼梯有N级,求总共有多少种走法?

小明有N个球,每次可以取1或2个球,输入球的数量,求出小明取球的方式有几种?

小明读书有两种方式,一种是可以选择精读一本书,另一种是速读两本书,输入书的数量,求出小明读书的方式有几种?
这个问题其实不好,因为读书一般读不一样的书,顺序不同的话差别很大。

其实根本就不用写碰撞算法看,很明显
递归:
一次只能走1,2,3级楼阶,你能走到N级楼阶,肯定是由N-3,N-2,N-1级楼阶走过来的。
答案=N-1级楼梯,N-2级楼梯,N-3级楼梯的走法之和。

动态规划:
1级楼阶肯定只有1钟走法
2级楼阶肯定只有2钟走法
3级楼阶肯定只有3钟走法
4级楼阶肯定只有从1,2,3级楼阶走过来,1+2+3=6
5级楼阶肯定只有从2,3,4级楼阶走过来,2+3+6=11

import random
# 碰撞出答案
allResult = set()
for i in range(10000):  # 碰撞次数
    bookCount = 7  # 书的数量
    bookOrder = ""  # 读书顺序
    while bookCount > 0:
        if bookCount == 1:
            bookOrder += "1"
            break
        if random.randint(0,1)==0:
            bookOrder += "1"
            bookCount -= 1
        else:
            bookOrder += "2"
            bookCount -= 2
    allResult.add(bookOrder)
print(len(allResult))
# 根据结果找规律 发现 3=1+2,5=3+3 ...
# 1 1
# 2 2
# 3 3
# 4 5
# 5 8
# 6 13
# 7 21

table = [1,2,3]
def getTable(n):
    for i in range(3,n+1):
        table.append(table[i-1] + table[i-2])

n = 5
getTable(n)
print(table[n-1])
### 回答1: 假设楼梯有n,小明可以选择每次1或2,那么完n楼梯不同走法数为斐波那契数列的第n+1项。 具体推导过程如下: 当n=1时,只有一走法,即每次。 当n=2时,有两走法,即每次或者第一次,第二次。 当n>2时,小明第一次可以选择或两,如果第一次,那么还剩下n-1楼梯,此时的走法数为完n-1楼梯走法数;如果第一次,那么还剩下n-2楼梯,此时的走法数为完n-2楼梯走法数。因此,完n楼梯不同走法数为完n-1楼梯走法数加上完n-2楼梯走法数,即斐波那契数列的第n+1项。 因此,当楼梯有n时,小明楼梯不同走法数为斐波那契数列的第n+1项。 ### 回答2: 小明爬楼梯题其实就是一个斐波那契数列的题。当小明只有一时,他只有一方法,那就是;当他有两时,他可以分别选择分两次或者一次,所以有两方法。而当他有多时,如何计算不同走法数呢? 假设有n,那么小明爬这个台的方法数就等于爬n-1的方法数和爬n-2的方法数之和。因为小明可以选择最后一或者两,所以到第n的方法数等于到第n-1的方法数加到第n-2的方法数。因此,当n>2时,有: f(n) = f(n-1) + f(n-2) 其中f(n)表示n不同走法数量,f(1)=1,f(2)=2。 用递归的方式来求解这个题时间复杂度为O(2^n),所以当n越大时计算时间会很长。因此,用动态规划可以更快速地解决题。先初始化f(1)=1、f(2)=2,再通过一个for循环依次计算f(3)、f(4)……f(n): ```python def climb_stairs(n: int) -> int: if n == 1: return 1 if n == 2: return 2 f1, f2, f3 = 1, 2, 0 for i in range(3, n+1): f3 = f1 + f2 f1 = f2 f2 = f3 return f3 ``` 上述代码的时间复杂度为O(n),用动态规划可以更加高效地计算小明爬楼梯不同走法数。 ### 回答3: 小明爬楼梯题可以用动态规划来解决。 我们先定义状态,令 f[i] 表示爬 i 楼梯不同走法数。显然,当 i = 1 时,f[1] = 1;当 i = 2 时,f[2] = 2(可以一次,也可以两次一)。当 i > 2 时,我们可以考虑最后一的情况。如果最后一一次,那么前面就必须到 i - 2 ,有 f[i - 2] 走法;如果最后一,那么前面就必须到 i - 1 ,有 f[i - 1] 走法。因此,f[i] = f[i - 1] + f[i - 2]。 最终的答案是 f[n],其中 n 表示楼梯数。 下面是 Python 代码实现: def climbStairs(n: int) -> int: if n <= 2: return n f = [0] * (n+1) f[1], f[2] = 1, 2 for i in range(3, n+1): f[i] = f[i-1] + f[i-2] return f[n]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值