动态规划题目及简要分析

版权声明:转载请注明出处 https://blog.csdn.net/github_37412255/article/details/81981408

动态规划题目及简要分析


摘要

在算法分析和实现中,动态规划是一种常见且重要的思想。掌握了该思想,会显著提高你的编程能力,几乎可以解决遇到的绝大多数问题。动态规划非常适合解决最大最小值、最多最少和最优等最值问题。动态规划常常与分治法放在一起比较,它们有许多共同点,放在一起比较可以更好地理解和掌握这两种方法。因此本文的主要内容有以下几点:

  1. 动态规划思想简介
  2. 动态规划与分治的对比
  3. 动态规划编程题

动态规划思想简介

动态规划与分治的对比

动态规划编程题

  1. 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。1
    说明:每次只能向下或者向右移动一步。
    示例:
    输入:
    [
    [1,3,1],
    [1,5,1],
    [4,2,1]
    ]
    输出: 7
    解释: 因为路径 1→3→1→1→1 的总和最小。
    实现:
class Solution:
    def minPathSum(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        n, m = len(grid), len(grid[0])
        for i in range(n):
            for j in range(m):
                x = y = 0
                if i - 1 >= 0 > j - 1:
                    x = y = grid[i - 1][j]
                if j - 1 >= 0 > i - 1:
                    x = y = grid[i][j - 1]
                if j - 1 >= 0 and i - 1 >= 0:
                    x = grid[i - 1][j]
                    y = grid[i][j - 1]
                grid[i][j] = min(x + grid[i][j], y + grid[i][j])
        return grid[-1][-1]

题目一分析:遍历grid,根据题目要求刷新其各元素的值。具体的,grid[0][0]元素保持不变,其余元素的刷新值为当前元素加上其左边和上边相邻元素的最小值(如果左边或者上边没有元素,则只加上存在元素值)。


猜你喜欢

转载自blog.csdn.net/github_37412255/article/details/81981408
今日推荐