leetcode 死磕动态规划-入门1

每天坚持刷题!!!
因为本人动态规划实在是弱鸡,激励自己攻克难关

首先来一些leetcode上动态规划的中等和简单的题来练练手, 个人对动态规划的理解就是可以把很多中间量储存在一个状态表里。

leetcode 62 不同路径

题目描述:
一个机器人位于一个 m x n 网格的左上角 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角,问总共有多少条不同的路径?

题目分析:
1. 首先要吐槽下leetcode中m*n的矩阵竟然是n行m列,简直反人类,但是这道题倒是无所谓结果都一样。
2. 因为机器人只能往下或是往右走,那么任何一个格子只能从这个格子的上方和左方到达,即任何一个格子的全部走法数量为上方格子(如果有)的走法数量加上左方格子(如果有)的走法数量之和。
3. 具体而言,先初始化一个m*n的二维矩阵(Python就是list of list),为了方便起见,先计算第一行和第一列的数值,这个没啥好说的,都是1,那么就从(1,1)开始先行在列的遍历整个矩阵,输出矩阵的右下角元素即可

class Solution(object):
    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        if not m or not n:
            return 0
        if m == 1 or n == 1:
            return 1
        temp = [[0 for _ in xrange(n)] for _ in xrange(m)]
        for i in xrange(n):
            temp[0][i] = 1
        for i in xrange(m):
            temp[i][0] = 1
        for i in xrange(1, m):
            for j in xrange(1, n):
                temp[i][j] = temp[i-1][j] + temp[i][j-1]
        return temp[-1][-1]

leetcode 63 不同路径 II
这道题跟上一道几乎一样就放一起做了

题目描述:
一个机器人位于一个 m x n 网格的左上角 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

题目分析:
1. 这个跟上一道62几乎一样,唯一的不同是现在格子上有障碍物,那么需要把有障碍物的位置的走法数量设置为0即可,初始化第一列和第一行的时候也是一样,最后吐槽下自己因为是中午休息时写的代码质量烂。
2. 还有这个题目设置的丧心病狂一点是起始点也可能有障碍物….

class Solution(object):
    def uniquePathsWithObstacles(self, obstacleGrid):
        """
        :type obstacleGrid: List[List[int]]
        :rtype: int
        """
        if not obstacleGrid:
            return 0
        m = len(obstacleGrid)
        n = len(obstacleGrid[0])
        temp = [[0 for _ in xrange(n)] for _ in xrange(m)]
        temp[0][0] = 1 if obstacleGrid[0][0] == 0 else 0
        for i in xrange(1, n):
            temp[0][i] = 1 if temp[0][i-1] and obstacleGrid[0][i] == 0 else 0
        for i in xrange(1, m):
            temp[i][0] = 1 if temp[i-1][0] and obstacleGrid[i][0] == 0 else 0
        for i in xrange(1, m):
            for j in xrange(1, n):
                if obstacleGrid[i][j] == 1:
                    temp[i][j] = 0
                else:
                    temp[i][j] = temp[i-1][j] + temp[i][j-1]
        return temp[-1][-1]

leetcode 64 最小路径和
PS:本来做完63想中午趴一会,一看64还是路径就继续做了…

题目描述:
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。每次只能向下或者向右移动一步。

题目分析:
1. 我已经不想在看到路径的题目了…
2. 这道题跟62没啥区别,就是把加法变成min函数,即每一个格子的走法数量为上方格子(如果有)的走法数量和左方格子(如果有)的走法数量的最小值

class Solution(object):
    def minPathSum(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        if not grid:
            return 0
        m = len(grid)
        n = len(grid[0])
        temp = [[0 for _ in xrange(n)] for _ in xrange(m)]
        temp[0][0] = grid[0][0]
        for i in xrange(1, n):
            temp[0][i] = temp[0][i-1] + grid[0][i]
        for i in xrange(1, m):
            temp[i][0] = temp[i-1][0] + grid[i][0]
        for i in xrange(1, m):
            for j in xrange(1, n):
                temp[i][j] = min(temp[i-1][j], temp[i][j-1]) + grid[i][j]
        return temp[-1][-1]

明天继续死磕动态规划

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值