LeetCode中的题-----不同路径

答案:

排列组合问题,横向和纵向加起来肯定是m+n-2步,相当于总数抽取其中n-1或m-1步

class Solution(object):
    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        fn_1 = 1
        fmn_2 = 1
        fm_1 = 1
        for i in range(1,n):
            fn_1 *= i
        for j in range(1,m):
            fm_1 *= j
        for k in range(1, m+n-1):
            fmn_2 *= k 
        return fmn_2 / (fm_1 * fn_1)

python中有直接求阶乘的方法

return math.factorial(m+n-2)//(math.factorial(m-1)*math.factorial(n-1))

 动态规划的解题:

直接dfs会超时,此题适合用动态规划或者记忆化搜索,dp方程描述:机器人从开始就一直往右走,只有一种走法(路径),机器人从一开始就一直往下走也只有一种走法(路径),机器人既往右走又往下走的走法(路径)数为从左边往右走的走法(路径)加从上边往下走的走法(路径)之和,dp[i][j]表示从(0,0)点到(i,j)点的走法(路径)数。记忆化搜索,记录下每次搜素完的结果,以便下一次搜索再利用,避免重复计算多次。总结,dp是自底向上,是一个逆推的过程,由多个小问题组合成一个大问题,最终根据递推公式算出最终解。(dfs)搜索是自顶向下,由大问题分解为多个类似的小问题,依次求解出小问题,最终回溯,从而将大问题求解出来。

class Solution(object):
    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
 
        if ( n == 0) or (m == 0):
            return 0
        if m == 1 and n == 1:
            return 1
        map = [[0 for col in range(n)] for line in range(m)]

        
        for line in range(m):
               for col in range(n):
                    if line == 0 and col == 0:
                        map[line][col] = 1
                    elif line == 0 and col != 0:
                        map[line][col] =  map[line][col - 1] 
                    elif col == 0 and line != 0:
                        map[line][col] = map[line-1][col] 
                    else:
                        map[line][col] = map[line][col - 1] + map[line-1][col]
                        

        return map[-1][-1]        

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

裸睡的雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值