Cómo convertirse en un maestro en programación dinámica

Esto es de mi experiencia,

  1. No piense primero en DP (de hecho, olvidemos qué es un DP) … intente primero resolver el problema con una solución recursiva
  2. Si encuentra una solución recursiva, entonces está 80% listo. si no encontró una solución recursiva GOTO paso-1 sino GOTO paso-3.
  3. Ahora formule un árbol basado en el método recursivo. Esto debería ser simple y complicado. Simplemente tome una pequeña entrada y dibuje todas las recursiones en forma de árbol. (estado de cada nodo en el parámetro de entrada a la función)
  4. Ahora vea qué nodos en el árbol anterior son iguales, es decir, cuáles son los nodos para los cuales los parámetros de entrada son los mismos.
  5. Si todavía está atascado para alcanzar este paso o muy lento, vaya al paso 3. (Recuerde lento y constante gana la carrera !!)
  6. Ahora intente pensar ¿Cómo puede calcular el resultado de dichos nodos cuyos parámetros de entrada son los mismos y reutilizarlos? Si el resultado depende de 3 parámetros de entrada, debe almacenarlo en una matriz tridimensional.
  7. Una vez que descubra el punto anterior, ya ha terminado el 95%. Si no, GOTO paso 6.
  8. Ahora código de mierda … si todavía está atascado REPETIR 8
  9. El fin

Definición

La programación dinámica (DP) es un método para resolver un problema complejo dividiéndolo en una colección de subproblemas más simples, resolviendo cada uno de esos subproblemas una sola vez y almacenando sus soluciones

Fuente de la imagen: Todo sobre programación dinámica – Codeforces


Propiedades de DP

Cada problema DP tiene las siguientes dos propiedades:

  • Subproblemas superpuestos : una solución óptima para una instancia contiene una solución óptima para sus subinstancias.

DP se utiliza principalmente cuando se necesitan soluciones de los mismos subproblemas una y otra vez. Si tomamos el ejemplo del siguiente programa recursivo para los números de Fibonacci , hay muchos subproblemas que se resuelven una y otra vez.

int fib (int n)
{
si (n <= 1)
return ((n == 1)? 1: 0);
retorno fib (n-1) + fib (n-2);
}

  • Subestructura óptima : una solución recursiva contiene un número “pequeño” de subproblemas distintos (repetidos muchas veces).

Un problema dado tiene una propiedad de subestructura óptima si se puede obtener una solución óptima del problema dado usando soluciones óptimas de sus subproblemas. Por ejemplo, el problema del camino más corto.

Nota: Los números representan la longitud de la ruta, las líneas rectas indican bordes individuales. Fuente de la imagen: Subestructura óptima – Wikipedia


Aprender DP

Algunos buenos recursos para comenzar con la programación dinámica son:

  • Programación dinámica: de principiante a avanzado – TopCoder
  • Todo sobre la programación dinámica – Codeforces
  • Tutorial para programación dinámica – Codechef
  • Capítulo 15 – Programación dinámica – CLRS
  • Programación dinámica – GeeksforGeeks
  • Introducción a la programación dinámica – HackerEarth
  • ¿Cuál es la diferencia entre la memorización y la programación dinámica? – StackOverflow
  • Programación y memorización dinámicas: enfoques ascendentes frente a descendentes – StackOverflow

Algunos problemas estándar de DP son:

  • Números de Fibonacci
  • Problema de intercambio de monedas
  • Problema de corte de varilla
  • Subcadena común más larga
  • Subsecuencia creciente más larga
  • Coeficiente binomial
  • Multiplicación de cadena matricial
  • 0-1 Problema de mochila
  • Árbol de búsqueda binario óptimo
  • Subarray contiguo de suma más grande (algoritmo de Kadane)

Videos


Practica DP

Una vez que haya entendido los conceptos, pruebe sus conocimientos de DP en algunas de estas plataformas (al menos dos):

  1. Programación dinámica – Juez A2 en línea ( preferido )
  2. Programación dinámica – TopCoder
  3. Programación dinámica – Juez Esfera en línea (SPOJ)
  4. Programación dinámica – HackerEarth
  5. Programación dinámica – LeetCode
  6. Programación dinámica – InterviewBit
  7. Programación dinámica – HackerRank
  8. CodeMonk DP – HackerEarth

Maestro dp

En resumen, no hay fórmula ni truco ni atajo ni ninguna ciencia espacial para dominar el DP. La única forma de dominar DP es siguiendo este ciclo de vida:

Aprender

Práctica

Repetir

Además de la práctica fuera de línea, participe en concursos de programación competitivos celebrados en TopCoder, Codeforces, Codechef, HackerRank o Hacker Earth.


Maestros en este campo

¡Aquí hay algunos (¡no todos!) De los programadores que han dejado su huella en la Comunidad de Programación Competitiva especialmente en DP ( sí, son maestros en DP )

  1. Michal Danilák
  2. ¿Cuál fue la estrategia de programación competitiva de Anudeep Nekkanti para convertirse en el puesto 35 en el ranking mundial, en solo 6-7 meses?
  3. Sesión de preguntas y respuestas con Sumeet Varma
  4. ¿Cómo hizo Ashish Kedia para dominar la programación dinámica?
  5. Algorithms Weekly por Petr Mitrichev
  6. Gennady Korotkevich – Wikipedia (mi favorito :))

A2A

Estos pueden ayudar:

  1. La respuesta de Manohar Reddy Poreddy a He resuelto alrededor de 150 problemas en programación dinámica, pero aún no reconozco la subestructura óptima para la mayoría de los problemas. ¿Cómo mejorar?
  2. La respuesta de Manohar Reddy Poreddy a ¿Cuál es más eficaz para ahorrar tiempo y espacio, recursividad o recorrido en bucle?
  3. La respuesta de Manohar Reddy Poreddy a ¿Cuáles son algunos problemas del mundo real que se han resuelto con programación dinámica?
  4. La respuesta de Manohar Reddy Poreddy a ¿Cómo desarrollar relaciones de recurrencia para problemas de programación dinámica?

Mis dos centavos –

Practica, por supuesto!

Algunos sitios que vale la pena visitar: –

  1. Geeksforgeeks – Programación dinámica – GeeksforGeeks, Programación dinámica | Algoritmos y estructuras de datos | Tutoriales de programación | GeeksforGeeks – YouTube
  2. HackerEarth (Tutorial y problemas) Introducción a la programación dinámica 1 Tutoriales y notas | Algoritmos | HackerEarth
  3. HackerRank resuelve los desafíos del código de algoritmos
  4. Problemas de práctica de programación dinámica

La programación dinámica se considera uno de los temas más difíciles cuando se trata de programación competitiva. Los conceptos teóricos no serán de gran ayuda aquí. Lo que necesita es mucha práctica. Diría que intente tantos problemas como pueda hasta que puede identificar la relación de recurrencia de un problema de forma oral … Ese es el nivel que necesita alcanzar y es factible resolviendo problemas sobre fuerzas de código, código chef, spoj, etc.

No puedes convertirte en un experto de nada en la vida real.

Practique los problemas de lectura sobre programación dinámica tanto como pueda, gane mucha experiencia ya que en informática el aprendizaje es incansable y no puede aprender completamente ningún tema.

No creo que nadie llegue a un nivel en el que “domine” la programación dinámica per se. Sin embargo, si desea sentirse más cómodo con la creación de soluciones DP en tiempos razonables, entonces mi sugerencia sería ** ver la solución ** de muchos problemas DP y ** Codificarlos **. Finalmente, comienzas a ver un patrón. En otras palabras, ¡solo practique el corte!

¡Buena suerte!

1) Conviértete en un gran maestro
2) Edad y degradarse al nivel de un maestro 😀

Sin embargo, si es necesario decirlo una vez más, la práctica es la ÚNICA manera. Muchas respuestas sobre Quora han dicho eso, y eso es cierto. Recursos: Todos los sitios principales (Topcoder, Codeforces, Codechef) tienen etiquetas. Resuelve esas preguntas.

Lo aprendí de CLRS y la programación competitiva 3, luego resolví mucho de Codeforces: conjunto de problemas – Codeforces

y así es como lo aprendí de CLRS:
La respuesta de Abdelrahman Hamdy a No soy bueno en programación dinámica y decidí leer el capítulo 15 de CLRS, ¿Cómo puedo abordar este capítulo?

La programación dinámica es algo que aprendes con la práctica.

Hay muchas formas de abordar y resolver problemas de programación dinámica como: recursión (de arriba hacia abajo), memorización (de arriba hacia abajo). Los mejores resultados provienen de DP de abajo hacia arriba. en mi libro de opinión “ Programación dinámica para la codificación de entrevistas (un enfoque ascendente para la resolución de problemas) ” es una buena fuente de DP.

El tema de la programación dinámica se trata de poder descubrir el problema central. Se espera que vea la cadena de los mismos problemas más pequeños que deben resolverse repetidamente para obtener el resultado final. Desde este punto de vista, es muy similar al enfoque recursivo, sin embargo, lo que hace que la programación dinámica sea más rápida es que, al contrario de lo recursivo, el mismo problema más pequeño no se resuelve una y otra vez, pero se espera que almacene (memorice) los resultados de los problemas más pequeños. solo para buscar el último en el momento de resolver el más grande.

More Interesting

¿Cuáles son las condiciones previas de la búsqueda binaria y qué papel desempeñan?

Para ubicarse dentro del top 3 en el próximo ICPC regional, ¿qué le sugeriría a un codificador de nivel medio que tenga suficiente conocimiento?

¿Cómo debo comenzar con las estructuras de datos y los conceptos de algoritmos suponiendo que sé cero?

¿Cómo podemos encontrar la segunda ruta más pequeña entre dos nodos en un gráfico ponderado / no ponderado de manera eficiente?

¿Algún consejo para estudiar la complejidad del espacio para programar entrevistas? ¿Cuáles son algunos buenos recursos para aprender sobre la complejidad del espacio?

¿Cuál es el algoritmo de clasificación más rápido para una matriz de números grandes (hasta 1,000,000,000,000)?

Cómo diseñar una estructura de datos que pueda almacenar 1-1000 números

Cómo establecer un límite máximo y mínimo para una variable entera / flotante en la definición

¿Qué árbol captura más CO2, un árbol completamente maduro o un árbol joven de rápido crecimiento?

Cómo resolver un cubo de rubik más rápido

¿Cuáles son los algoritmos necesarios para resolver div2 500 y div2 1000 fácilmente en topcoder?

¿Cómo idearé un algoritmo eficiente para determinar todos los cursos que debo tomar antes de un curso en particular sin un orden topológico?

¿Podemos encontrar si la matriz no contiene un elemento mayoritario en un tiempo casi constante?

Siempre sueño con trabajar en grandes empresas tecnológicas como Google o Facebook, pero mi habilidad con los algoritmos es muy débil. Intento resolver problemas en Google Code Jam y CodeChef, pero solo puedo resolver los fáciles. ¿Qué tengo que hacer?

¿Qué algoritmo se usa para detectar "No más interruptores posibles, barajar" en la saga Candy Crush?