不同的路径

题目描述:有一个机器人的位于一个M×N个网格左上角。机器人每一时刻只能向下或者向右移动一步。机器人试图达到网格的右下角。问有多少条不同的路径?


跟之前的那道“最小路径和”(详见:点击打开链接)是一模一样的逻辑,而且比之前还要简单。

1. 看状态如何转移:到达网格的i行j列可能的路径为到达i - 1行,j列的路径数加上到达i行,j - 1列的路径数,因为机器人只有这两条途径能到达目的地[i][j]。用二维数组record存储到达每个位置可能的路径数,则record[i][j] = record[i - 1][j] + record[i][j - 1]

2. 处理边界:record第一行和第一列的所有值都是1(直观上理解也很容易,因为只能向下或向右走,所以到达这些位置只可能有一条路径). 你也可以看做因为状态转移方程中有一项不存在了。

给出代码:

# method_1

class Solution:
    """
    @param n and m: positive integer(1 <= n , m <= 100)
    @return an integer
    """ 
    def uniquePaths(self, m, n):
        if m < 1 or n < 1:
            return 0
        # 方便起见,令表格初始化为全部是1
        record = [[1 for i in range(n)] for j in range(m)]
        for i in range(1, m):
            for j in range(1, n):
                record[i][j] = record[i - 1][j] + record[i][j - 1]
        return record[m - 1][n - 1]
        # write your code here


# method_2

class Solution:
    """
    @param n and m: positive integer(1 <= n , m <= 100)
    @return an integer
    """ 
    def uniquePaths(self, m, n):
        if m < 1 or n < 1:
            return 0
        if m == 1 and n == 1:
            return 1
        else:
            return self.uniquePaths(m - 1, n) + self.uniquePaths(m, n - 1)
        # write your code here

我给出了两段代码,方法2是用递归做的,大家可以感受一下动态规划和递归的不同(我在上一篇博客中讲过,一个是“从小到大”,一个是“从大到小”)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值