トピック:
ロボットはm x n
グリッドの左上隅に配置されます (下の図では開始点に「開始」というラベルが付いています)。
ロボットは一度に 1 ステップ下または右へのみ移動できます。ロボットはグリッドの右下隅 (下の画像で「終了」とマークされている) に到達しようとします。
異なるパスは合計で何通りありますか?
例 1:
入力: m = 3、n = 7 出力: 28
例 2:
入力: m = 3、n = 2 出力: 3 説明: 左上隅から開始して、右下隅に到達するまでに合計 3 つのパスがあります。 1. 右 -> 下 -> 下 2. 下 -> 下 -> 右 3. 下 -> 右 -> 下
例 3:
入力: m = 7、n = 3 出力: 28
例 4:
入力: m = 3、n = 3 出力: 6
問題解決のアイデア:ロボットが右下隅に到達したい場合、右に進むか下に進むしかありません。dp[i][j] を i、j に到達するための最も多くのパスであるとすると、次の動的方程式が成立します: dp[i][j] = dp[i-1][j] + dp[i][j- 1]。同時に、境界条件があります。最初の行dp[0][j]
または最初の列についてはdp[i][0]
、それらはすべて境界上にあるため、次の条件のみが可能です。1。
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
# 令 dp[i][j] 是到达 i, j 最多路径
# 动态方程:dp[i][j] = dp[i-1][j] + dp[i][j-1]
# 如果 i=0,那么 dp(i−1,j)并不是一个满足要求的状态,我们需要忽略这一项;同理,如果 j=0那么 dp(i,j−1) 并不是一个满足要求的状态
dp = [[0]*n for zong in range(m)] # 二维矩阵
for i in range(m): # 边界条件
dp[i][0] = 1
for j in range(n): # 边界条件
dp[0][j] = 1
for i in range(1,m):
for j in range(1,n):
dp[i][j] = dp[i-1][j]+dp[i][j-1]
return dp[-1][-1]