問題の解決策: Lituo 62: 異なるパス

トピック:

ロボットは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]

おすすめ

転載: blog.csdn.net/weixin_45314061/article/details/130131136