Plantilla de programación dinámica: versión de Python

Este artículo es de https://leetcode.com/discuss/general-discussion/458695/Dynamic-Programming-Patterns,  este internauta extranjero, soy  responsable de la localización

Tabla de contenido

1. El problema de tipo de ruta mínimo (máximo) para alcanzar la meta

De dos formas diferentes

3. Intervalo de consolidación

Problema de DP de cuatro cuerdas

En cuarto lugar, plantee problemas de toma de decisiones.


1. El problema de tipo de ruta mínimo (máximo) para alcanzar la meta

La descripción de este tipo de problema es: Dada una meta, encuentre el costo mínimo (máximo) (costo) / ruta (ruta) / suma (suma) para alcanzar la meta.

El código de plantilla general es:

for i in range(1,target+1):
    for j in range(len(ways)):# ways:达到目标的方法个数
        if ways[i]<=i:
            dp[i] = min(dp[i], dp[i - ways[j]] + 代价(cost) / 路径(path) / 总和(sum))
return dp[target]

Preguntas similares son:

  1. Sube escaleras con un costo mínimo
  2. Suma de ruta mínima
  3. Cambio de intercambio
  4. Suma mínima de trayectoria de descenso
  5. Precio más bajo
  6. Teclado con solo dos teclas

  7. Número cuadrado perfecto

  8. Peso de la última piedra II 

  9. Triángulo 

  10. Unos y ceros 

  11. Cuadrado máximo

  12. Cambio de moneda

  13. Mosaico de un rectángulo con el menor número de cuadrados

  14. Juego de mazmorras

  15. Número mínimo de paradas para repostar 

De dos formas diferentes

La descripción de este tipo de problema es: dado un objetivo, encontrar diferentes formas de alcanzar el objetivo

El código de plantilla general es:

for i in range(1,target):
    for j in range(len(ways)):
        if ways[j]<=i:
            dp += dp[i-ways[j]]
return dp[target] 

Preguntas similares son:

  1. Subiendo escaleras 
  2. Caminos únicos 
  3. Número de tiradas de dados con suma objetivo

También hay preguntas que indican el número de repeticiones, en este caso agregue un bucle para simular cada repetición.

  1. Probabilidad de caballero en tablero de ajedrez 
  2. Suma objetivo 
  3. Suma de combinación IV 
  4. Marcador de caballero 
  5. Simulación de tirada de dados 
  6. Partición igual subconjunto suma 
  7. Porciones de sopa 
  8. Azulejos Domino y Tromino
  9. Intercambios mínimos para aumentar las secuencias
  10. Número de subsecuencia creciente más larga 
  11. Caminos únicos II
  12. Caminos fuera de los límites 
  13. Número de formas de permanecer en el mismo lugar después de algunos pasos 
  14. Contar la permutación de vocales 

3. Intervalo de consolidación

La descripción de este tipo de problema es: Dado un conjunto de números para obtener el mejor valor, puede encontrar la solución al problema a partir del número actual y el número a la izquierda o derecha del mismo.

El código de plantilla general es:

for l in range(1,n):
    for i in range(n-l):
        j = i+l
        for k in range(i,j):
            dp[i][j] = max(dp[i][j], dp[i][k] + result[k] + dp[k+1][j])
return dp[0][n-1]

Preguntas similares son:

  1. Árbol de costo mínimo a partir de valores de hoja
  2. Árboles de búsqueda binarios únicos
  3. Triangulación de puntuación mínima del polígono 
  4. Eliminar cajas 
  5. Costo mínimo para fusionar piedras 
  6. Estallido de globos 
  7. Adivina el número más alto o más bajo II

Problema de DP de cuatro cuerdas

La descripción de este tipo de problema es: Dadas dos cadenas s1 y s2, devuelve algunos resultados

El código de plantilla general es:

/**
i : 字符串s1的下标
j : 字符串s2的下标
**/
for i in range(1,n+1):
    for j in range(1,m+1):
        if s1[i-1] == s2[j-1]:
            dp[i][j] = #code....#
        else:
            dp[i][j] = #code....#

Si te das una cadena, el método es casi el mismo:

for l in range(1,n):
    for i in range(n-l):
        j = i+l
        if s[i] == s[j]:
            dp[i][j] = /*code*/
        else:
            dp[i][j] = /*code*/

Preguntas similares son:

  1. Subsecuencia común más larga 
  2. Subcadenas palindrómicas
  3.  Subsecuencia palindrómica más larga 
  4. Supersecuencia común más corta 
  5. Editar distancia
  6. Subsecuencias distintas 
  7. Suma de eliminación mínima ASCII para dos cadenas
  8. Subcadena palindrómica más larga

En cuarto lugar, plantee problemas de toma de decisiones.

Descripción del problema: dado un conjunto de valores, encuentre la respuesta y brinde la opción de elegir o ignorar el valor actual

Código de plantilla genérico:

#i: 一组值的下标
#j: 忽略j值的选项
for i in range(1,n):
    for j in range(1,k+1):
        dp[i][j] = max(dp[i][j], dp[i-1][j] + arr[i], dp[i-1][j-1])
        dp[i][j-1] = max(dp[i][j-1], dp[i-1][j-1] + arr[i], arr[i])
        

Preguntas similares son:

  1. Ladrón de casa 
  2. Mejor momento para comprar y vender acciones
  3. Mejor momento para comprar y vender acciones con tarifa de transacción
  4. Mejor momento para comprar y vender acciones con enfriamiento 
  5. Mejor momento para comprar y vender acciones III 
  6. Mejor momento para comprar y vender acciones IV 

De hecho, muchos problemas pueden resolverse sin programación dinámica A continuación, se incluye un resumen de las soluciones a problemas similares.

Supongo que te gusta

Origin blog.csdn.net/Matrix_cc/article/details/109584049
Recomendado
Clasificación