機器人從起點到終點有多少條不同的路徑,只能向右或者向下走。
注意點:
格子大小最大為100*100例子:
輸入: m = 3, n = 7
輸出: 28
很常見的小學生奧數題,可以用排列組合來求解,一共要走(m-1)+(n-1)步,其中(m-1)步向下,(n-1)向右,且有公式 mCn = n!/m!(n-m)!
,那麼可以用下面的代碼求解:
import math
class Solution(object):
def uniquePaths(self, m, n):
"""
:type m: int
:type n: int
:rtype: int
"""
m -= 1
n -= 1
return math.factorial(m+n) / (math.factorial(n) * math.factorial(m))
當然了,更常見的一種做法就是動態規劃,要到達一個格子只有從它上面或者左邊的格子走過來,遞推關系式:dp[i][j]=dp[i-1][j]+dp[i][j-1]
。初始化條件是左邊和上邊都只有一條路徑,索性在初始化時把所有格子初始化為1。
class Solution(object):
def uniquePaths(self, m, n):
"""
:type m: int
:type n: int
:rtype: int
"""
dp = [[1 for __ in range(n)] for __ in range(m)]
for i in range(1, n):
for j in range(1, m):
dp[j][i] = dp[j - 1][i] + dp[j][i - 1]
return dp[m - 1][n - 1]
if __name__ == "__main__":
assert Solution().uniquePaths(3, 7) == 28