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:可以一步步走,也可以一下跨两步 [[1,1],[2]]
上一步为23:接下来的两步只能为 [1,1] - 差三步:
起始状态或者上一步为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)