python - leetcode - 64. Ruta mínima y [Solución de problema clásico: programación dinámica de matriz matricial]

1. Tema: 64. Suma de ruta mínima

Descripción:
Dada una cuadrícula mxn que contiene números enteros no negativos, busque una ruta desde la esquina superior izquierda hasta la esquina inferior derecha, de modo que la suma de los números en la ruta sea la más pequeña.

Nota: Solo puedes moverte un paso hacia abajo o hacia la derecha a la vez.
Ejemplo 1:
Insertar descripción de la imagen aquí

输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 13111 的总和最小。

Ejemplo 2:

输入:grid = [[1,2,3],[4,5,6]]
输出:12

pista:

  • m == longitud.cuadrícula
  • n == cuadrícula[i].longitud
  • 1 <= m, n <= 200
  • 0 <= cuadrícula[i][j] <= 200

2. Ideas para resolver problemas

Dado que la dirección del camino solo puede ser hacia abajo o hacia la derecha, cada elemento en la primera fila de la cuadrícula solo puede moverse hacia la derecha desde el elemento superior izquierdo, y solo se puede llegar a cada elemento en la primera columna de la cuadrícula desde la parte superior izquierda El elemento de la esquina comienza a moverse hacia abajo y la ruta en este momento es única, por lo que la suma mínima de ruta correspondiente a cada elemento es la suma de los números en la ruta correspondiente.

Para los elementos que no están en la primera fila ni en la primera columna, puede moverse un paso hacia abajo desde el elemento adyacente encima de él, o moverse un paso hacia la derecha desde el elemento adyacente a la izquierda.La suma de ruta mínima correspondiente al elemento es igual al elemento adyacente encima de él y al elemento El valor mínimo de la suma de las rutas mínimas correspondientes a los dos elementos adyacentes a la izquierda más el valor del elemento actual. Dado que el camino mínimo correspondiente a cada elemento está relacionado con la suma de los caminos mínimos correspondientes a sus elementos adyacentes, se puede utilizar programación dinámica para resolverlo.

Crear una matriz bidimensional
Insertar descripción de la imagen aquí

Finalmente, se obtiene el valor de dp[m−1][n−1], que es la suma de los caminos mínimos desde la esquina superior izquierda de la cuadrícula hasta la esquina inferior derecha de la cuadrícula.

3. Ejemplos de código

class Solution(object):
    def minPathSum(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        # 解法一, 空间优化
        m, n = len(grid), len(grid[0])
        for i in range(1, n):  # 第一行初始化
            grid[0][i] = grid[0][i] + grid[0][i - 1]
        for i in range(1, m):  # 第一列初始化
            grid[i][0] = grid[i][0] + grid[i - 1][0]
        for i in range(1, m):  # 对剩下的格子进行填充
            for j in range(1, n):
                grid[i][j] = grid[i][j] + min(grid[i - 1][j], grid[i][j - 1])
        return grid[-1][-1]

		# 解法二
        if not grid or not grid[0]:
            return 0
        rows, columns = len(grid), len(grid[0])
        dp = [[0] * columns for _ in range(rows)]
        dp[0][0] = grid[0][0]
        for i in range(1, rows):
            dp[i][0] = dp[i - 1][0] + grid[i][0]
        for j in range(1, columns):
            dp[0][j] = dp[0][j - 1] + grid[0][j]
        for i in range(1, rows):
            for j in range(1, columns):
                dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]
        return dp[rows - 1][columns - 1]

		# 解法三
        m, n = len(grid), len(grid[0])
        # 状态定义:dp[i][j] 表示从 [0,0] 到 [i,j] 的最小路径和
        dp = [[0] * n for _ in range(m)]
        # 状态初始化
        dp[0][0] = grid[0][0]
        # 状态转移
        for i in range(m):
            for j in range(n):
                if i == 0 and j != 0:
                    dp[i][j] = grid[i][j] + dp[i][j - 1]
                elif i != 0 and j == 0:
                    dp[i][j] = grid[i][j] + dp[i - 1][j]
                elif i != 0 and j != 0:
                    dp[i][j] = grid[i][j] + min(dp[i - 1][j], dp[i][j - 1])
        # 返回结果
        return dp[m - 1][n - 1]

Supongo que te gusta

Origin blog.csdn.net/qq_43030934/article/details/131682071
Recomendado
Clasificación