问题
解题思路
方法一:递归
递归终止条件为A和B相遇或者A已经超越了B。
否则就分别枚举他们两个人走楼梯的级数的所有可能情况。
方法二:动态规划
这一问题可以转换为求A走了偶数次后到达楼顶的情况数。
因为假设A走了2
x
x
x后到达楼顶,则可以视作A走了
x
x
x次的同时B也走了剩余的
x
x
x次,这时他们必定会相遇。
故可以用动态规划求解,dp[j]表示当A到达j点时走了i次时的所有的可能情况数。代码中直接用了滚动数组的方式优化了空间复杂度,所以用的一维数组,滚了10次,取其中偶数次的dp[10]。
代码
方法一:
def dfs(a,b):
#A和B相遇,返回1
if a==b:
return 1
#A已经超越了B,返回0
if a>b:
return 0
#否则枚举所有可能情况
res=0
for i in range(1,5):
for j in range(1,5):
res+=dfs(a+i,b-j)
return res
print(dfs(0,10))
方法二:
dp=[0]*11
dp[0]=1
res=0
for i in range(1,11):
for j in range(10,-1,-1):
for k in range(1,5):
if j+k>10:
break
dp[j+k]+=dp[j]
dp[j]=0
if i%2==0:
res+=dp[10]
print(res)