题目:假设有排成一行的N个位置,标记为1-N,N一定大于或等于2.开始时机器人在其中的M位置上(M一定是1-N中的一个),机器人可以往左走或者往右走,如果机器人来到1位置,那么下一步只能往右来到2位置;如果机器人来到N位置,那么下一步只能往左来到N-1位置,规定机器人必须走K步,最终能来到P位置(P也一定是1-N中一个)的方法有多少种,给定四个参数N,M,K,P,返回方法数。
要求:时间复杂度为O(N*K)
"""暴力递归解法"""
def walk(N,M,K,P):
"""
N:表示大小0-N-1
M:表示当前位置
K:表示剩余步数
P:表示目标位置
"""
if K == 0:
if M == P:
return 1
else:
return 0
if M == 1:
return walk(N,2,K-1,P)
if M == N:
return walk(N,N-1,K-1,P)
return walk(N,N-1,K-1,P) + walk(N,N+1,K-1,P)
def ways(N,M,K,P):
if N < 2 or M < 1 or M > N or K < 1 or P < 1 or P > N:
return 0
return walk(N,M,K,P)
""" 动态规划方法"""
def ways(N,M,K,P):
if N < 2 or M < 1 or M > N or K < 1 or P < 1 or P > N:
return 0
dp = [[0]*(N+1)]*(K+1)
dp[0][P] = 1
for i in range(1,K):
for j in range(1,N):
if j == 1:
dp[i][j] = dp[i-1][2]
elif j == N:
dp[i][j] = dp[i-1][N-1]
else:
dp[i][j] = dp[i-1][j-1] + dp[i+1][j-1]
return dp[K][M]