机器人达到指定位置方法数

题目:假设有排成一行的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]

    

 

你可能感兴趣的:(秋招)