数据结构与算法——爬楼梯

1. 1.2.3随便爬

class Solution4():
    def count_number(self,n):
        dp=[0]*(n+1)
        dp[1]=1
        dp[2]=2
        dp[3]=4
        for i in range(4,n+1):
            dp[i]=dp[i-1]+dp[i-2]+dp[i-3]
        # print(dp)
        return dp[n]

2. 1.2爬楼,不能连爬2

class Solution2():
    def count_number(self,n,status):
        if n<1:return 0
        if n==1:return 1
        if n==2:
            if status==2:return 1 #上一步是走的两步, 则只能一步一步走
            if status==1:return 2 #上一步是走的1步, 则可以全走一步,或者直接走两步
            if status==0:return 2 #开始只有两阶的
        if n>2:
            if status==0:return self.count_number(n-1,1)+self.count_number(n-2,2)
            if status==1:return self.count_number(n-1,1)+self.count_number(n-2,2)
            if status==2:return self.count_number(n-1,1)

3. 1.2.3 ( 23之后必须为1)

每次可以爬1,2,3阶楼梯。但是如果上一步是2or3阶那么下一阶必须为1阶,计算爬n阶楼梯的所有方法

可以看作是动态爬楼过程。划分三种状态:0.开始爬 1.上一步为1阶 23.是一步非1阶

  1. 差一步:[1]
  2. 差两步:
    起始状态或者上一步为1:可以一步步走,也可以一下跨两步 [[1,1],[2]]
    上一步为23:接下来的两步只能为 [1,1]
  3. 差三步:
    起始状态或者上一步为1:可以一步步走,先1后2,先2后1,直接3 [[1,1,1],[1,2],[2,1],[3]]
    上一步为23:接下来的三步可以为 [[1,1,1],[1,2]]
class Solution3():
    def count_number(self,n,status):
        if n<1:return 0
        if n==1:return 1
        if n==2:
            if status==0:return 2   #[[1,1],[2]]
            if status==1:return 2   #[[1,1],[2]]
            if status==23:return 1  #[[1,1]]
        if n==3:
            if status==0:return 4    #[[1,1,1],[1,2],[2,1],[3]]
            if status==1:return 4    #[[1,1,1],[1,2],[2,1],[3]]
            if status==23:return 2   #[[1,1,1],[1,2]] 
        if n>3:
            if status==0:return self.count_number(n-1,1)+self.count_number(n-2,23)+self.count_number(n-3,23)
            if status==1:return self.count_number(n-1,1)+self.count_number(n-2,23)+self.count_number(n-3,23)
            if status==23:return self.count_number(n-1,1)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小屋*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值