¿Cuál es la mejor manera de aprender programación dinámica?

Te diré algunos puntos.

  1. Primero aumenta tus habilidades de pensamiento. (No tome esto, de manera incorrecta, lo que quiero decir es, resuelva el problema relacionado con la Recursión y después de resolver el problema mediante la recursión, intente resolverlo de manera iterativa (si es posible, pero inténtelo), ¿cómo ayudará? lo entenderás.) y si ya has practicado, salta al segundo paso.
  2. Luego comienza a resolver la pregunta de programación dinámica clásica.
    1. Mochila.
    2. LCS.
    3. Matriz de multiplicación de cadenas.
    4. Cambio de moneda.
    5. LIS.
    6. Editar distancia.
    7. Partición equilibrada.
    8. Estrategia óptima para un juego.
  3. Ahora comience a resolver el problema de DP en varios Jueces en línea (Spoj, Codeforces, hackerrank, codechef, etc.)
  4. Si se queda atascado en algún lugar y no encuentra ninguna solución, lea la solución de otros usuarios e intente comprenderlos. También aumentará tus habilidades de pensamiento, sabrás que (ohh, sí, también se puede resolver de esta manera).
  5. Por último, pero no menos importante, DP es el ejemplo perfecto de “La práctica hace al hombre perfecto. Cuanto más practicas, más aprendes.

Ahora, todavía estás pensando que por eso me concentro más en la recursión, algunas veces pensar que una solución recursiva es más fácil que iterativo (ese es mi punto de vista, tal vez sea fácil de resolver a través de iterativo).

Algunas referencias para la práctica: –

Programación dinámica – desde principiante hasta avanzado

Algoritmos – GeeksforGeeks

Clasificador de problemas para SPOJ.pl

Problemas de programación para dp.

700 problemas para entender tu completa programación algorítmica.

Tutorial de Programación Dinámica

Programación Dinámica – I – Arjit Srivastava

http://nanocad.ee.ucla.edu/pub/M…

Espero que esto te ayudará. 🙂 Diviértete. 🙂

¡Mirad! Voy a revelar el código de trucos para que salga ileso del otro lado, habiendo dominado a la bestia no domable, también conocida como programación dinámica. Esa es la manzana del conocimiento que desayunarás hoy.

O al menos eso es lo que pensaste cuando empezaste a leer esto, ¿verdad? O quizás estabas pensando, “¿quién es este tipo que incluso diría que intenta enseñar los secretos de ese método esotérico?”

En serio, soy un don nadie. Y definitivamente soy el tipo de persona que tendría una sonrisa en su rostro si el entrevistador o el Prof. in viva no piden nada de la programación dinámica.

Bueno, ya sabes lo que dicen. Los que no pueden, enseñan .


¿Aún conmigo? Tsk, tsk. Ya me siento mal por ti. Quiero decir, si ni siquiera pretendo dar un consejo en este momento, probablemente murmuren maldiciones, y tengo la sensación de que eso podría estropearme. karma.

Por lo tanto, la programación dinámica. ¿Recuerdas cuando dicen: ” Mira siempre el panorama general “? ¿O cuando alguien usa la frase ” No puedes ver el bosque para un árbol “? La Programación Dinámica es la versión de los programadores de mirar el panorama general.

Vamos a jugar un juego simple. Estás en un país extraño, y este solo tiene billetes de $ 5, $ 2, $ 1. Tienes que pagar $ 8 para salir de un atasco. Llamemos a eso una multa por exceso de velocidad. Y la ley no le permite elegir más billetes de los necesarios. Entonces, ¿cómo ganas $ 8? Sencillo. Usted comienza con el mayor valor de la factura que puede obtener. Eso es $ 5. ¿Ya son $ 8?

No, no es. Vamos a elegir otros $ 5 entonces. ¿Es $ 8 ahora? Técnicamente, han pasado los $ 8 y la señora en el mostrador del banco no le va a dar ningún cambio. Ella sonríe ante tus habilidades matemáticas.

Bien, si no $ 5, solo ve con la próxima factura de mayor valor. Eso es $ 2. Ahora tienes $ 7. ¿Es $ 8? Realmente no. Pero hay un billete de $ 1, así que puedes tirar uno de esos y pagar para salir de la situación.

En el siguiente país en su gira, aparece en otra tierra igualmente sospechosa y se metió en un problema similar. Tienes que pagar la misma multa de $ 8 nuevamente. Con el mínimo número posible de facturas.

Ahora tiene facturas de $ 5, $ 4, $ 1. Entonces, ¿qué haces para obtener $ 8? Usted comienza con el valor más alto de la factura que tiene: $ 5. Justo como antes. Solo necesita aportar $ 3 después de sacar $ 5 de su billetera. Caminas hacia el mostrador, le das a la dama esos 4 billetes, uno de $ 5 y otros tres billetes de $ 1. ¿Y ella qué hace? Ella se ríe de tus habilidades para contar y dice: “¿En serio? ¿Estás desperdiciando 4 billetes por $ 8? Puedes hacerlo mejor. Ahorra papel “.

Te confundes ¿Qué hay de malo en tu estrategia? Estás agregando lo que puedas en este momento. Suena razonable, ¿verdad? Para minimizar el número de billetes, está agregando el valor máximo o la denominación a la mezcla. Bueno, como resultado, puedes poner dos billetes de $ 4 y ahorrar un 50% en papel en el proceso.

Claramente, su estrategia inicial no fue universalmente cierta. Estabas haciendo tu mejor esfuerzo en este momento . Estabas viendo cuánto necesitas para alcanzar la meta y agregando lo mejor que pudieras. Pero, ¿qué deberías haber hecho en su lugar?

Deberías haber dado un paso atrás. Debería haber mirado todo lo que tiene, desde lo mejor que puede hacer hasta lo peor que puede hacer. Y luego tomó una decisión, con la imagen más grande en su mente.


Eso es programación dinámica para ti. Siempre recuerda lo que tienes. Haga que todos sus activos sean parte de la ecuación. ¡Probablemente ya lo sabías! En ese caso, por favor, no me maten por tratarlo como un noob durante tanto tiempo.

Es un concepto de aplicación general. Cuando se necesita reducir la complejidad de tiempo (tiempo necesario para completar una ejecución en función del tamaño de entrada), se debe aumentar la complejidad de espacio (memoria ocupada para completar una ejecución en función del tamaño de entrada). [Sí, lo sé. Solo estás ansioso por comentar y frotarme en mi cara, citando contra-ejemplos de donde eso no es verdad, ¿no es así? ¡Adelante, comenta!]

Eso es lo que haces en un problema de programación dinámica. En lugar de elegir a ciegas lo mejor en cada etapa, mantienes una mesa. Y use esa tabla para comparar entre algunas opciones posibles, que son un poco complicadas que elegir el mejor en este momento. Usted agrega el mejor valor posible obtenido por este método.

Entonces, ¿de dónde obtienes buenos recursos para aprender esto? Comience con el libro CLRS. Intente resolver problemas clásicos de DP como EDITAR DISTANCIA o LA SUBSECUENCIA MÁS LARGA. Y por resolver, quiero decir, tomar algunos datos de muestra, codificar en una solución en un idioma que conozca, ejecutar algunos casos de prueba.

No voy a entrar en todas esas teorías de estructuras subóptimas. Sólo lee esa mierda. Y tome un lápiz y papel, asuma algunos casos de uso, elabore algunos ejemplos a mano con valores de muestra. Tus conceptos estarían mejor grabados en tu memoria.

Ahora, vaya a http://www.geeksforgeeks.org y vea cómo resolvieron los problemas de programación dinámica. Tienen una buena colección de problemas de programación dinámica estándar. No mires las soluciones al principio. Intenta codificarlos por tu cuenta. Sí, todos dicen eso! Pero eres sincero con el aprendizaje, y el código secreto de trucos es que si intentas honestamente sin mirar la solución al principio, te beneficiará mucho. Luego revise los comentarios también, para una solución alternativa para el mismo problema.

A continuación, pruebe los tutoriales de TopCoder. Intente resolver problemas de DP similares del juez en línea de Esfera (SPOJ), la competencia de programación, el concurso de programación, la programación de computadoras en línea, HackerRank, etc. sitios de codificación competitivos. Scourge Google para preguntas de DP en entrevistas.

Y cuando dije intentarlo, me refería al tipo de intento sólido de Yoda, es decir, hacer o no, no hay intento. Si después de todo esto todavía no confía en la programación dinámica, hágamelo saber.

La mejor manera de aprender programación dinámica es resolviendo problemas de programación dinámica. Intenta resolver tantos problemas de programación dinámica como puedas. Pronto podrás resolver los problemas tú mismo. Podrá ver cómo una solución de problemas se puede dividir en subestructuras óptimas y sub problemas superpuestos.

Si inicialmente te resulta difícil resolver problemas de DP, puedes ver videos de Youtube:

Programación dinámica de videos de Youtube

También puedes probar las soluciones dadas aquí:

Preguntas de la entrevista de programación dinámica

Comienza con los problemas más simples primero y luego pasa a las preguntas más difíciles:

  1. Número de Fibonacci
  2. Suma máxima de subarreglos
  3. Problema de ruptura de palabras
  4. Número total de posibles árboles binarios de búsqueda con las teclas ‘n’
  5. Subconjunto del problema de suma
  6. Palíndromo más corto
  7. Palindrome Min Cut
  8. Número mínimo de intentos para llegar desde la palabra de origen a la palabra de destino
  9. Número mínimo de monedas para hacer cambio.
  10. Encuentra la ruta de costo mínimo en una matriz
  11. La subcadena palindrómica más larga
  12. Secuencia palindrómica más larga
  13. Encuentra la longitud de la subsecuencia creciente más larga en una matriz
  14. Secuencia creciente más larga O (n logn)
  15. La subcadena común más larga
  16. La subsecuencia común más larga
  17. Encuentra la longitud de la subsecuencia bitónica más larga en una matriz
  18. Para imprimir el número máximo de Como usando cuatro claves dadas.
  19. Problema de la mina de oro
  20. Encuentra la distancia de edición mínima entre dos cadenas dadas
  21. 0-1 Problema de mochila
  22. Distintas cadenas binarias de longitud n sin 1s consecutivos
  23. Contar todas las decodificaciones posibles de una secuencia de dígitos dada
  24. Encuentra el número total de formas de hacer cambios usando un conjunto de monedas dado
  25. Establecer problema de partición | Programación dinámica

¡Buena suerte!

¡Espero que esto ayude!

Paciencia Créeme, sin paciencia es realmente difícil algo nuevo. Hice varios intentos antes de aprender algo de DP. Cada vez que comencé, me rendiría incluso antes de entender lo básico. Por lo tanto, tenga la paciencia del mundo mientras aprende, de lo contrario, terminaría por robar algunas soluciones aquí y allá que no serían de mucha ayuda a largo plazo.

Comience con lo básico. Comencé aprendiendo de
Archivos de programación dinámica – GeeksforGeeks
Recomiendo comenzar desde la última página de esto (ya que creo que esos son los más básicos).
Luego, gradualmente, completa el resto y REVISE al menos una vez que hayas terminado.

La forma de aprender, sugeriría no es codificar (sírvase codificar los problemas, si tiene tiempo), sino entender la pregunta a fondo y luego intentar resolverlo con todas las técnicas que conoció previamente escribiendo en un papel. la parte crucial del algoritmo (caso base + desglose en subproblemas).

Una vez que sienta que ya no puede pensar más en una solución o que ha alcanzado una buena solución para la pregunta, lea la solución dada y entienda cada una de ellas, ya que generalmente tendemos a perder los casos fronterizos y la compara con la solución que ha alcanzado. y reflexionar sobre las diferencias. Observe y entienda adecuadamente los casos base y por qué es así.

Por último, también puede leer la sección donde le piden que piense en las variaciones del problema dado (si está presente, se da después de la solución en la misma página).

Buena suerte !

1.) Lea acerca de qué se trata la programación dinámica, puede tomar la ayuda de los algoritmos. GeeksforGeeks, lea todos los artículos de esta página e intente averiguar por qué le viene a la mente aplicar la programación dinámica para resolver un problema. .

2.) Recuerde, la identificación del problema a resolver a partir de la programación dinámica es realmente importante y no hay una forma particular de abordar esto, ya que esto solo puede surgir a través de problemas de práctica.

3.) Ahora trate de resolver problemas, creo que hackerrank.com es la mejor manera de practicar la programación dinámica, puede consultar este enlace … https://www.hackerrank.com/domai

Puede buscar en Google problemas basados ​​en programación dinámica en spoj.com codechef.com topcoder.com codeforces.com

4.) Recuerde que la programación dinámica es la técnica difícil de aprender, pero hacer mucha práctica y esperanza le hará aprender DP.

BUENA SUERTE y APRENDIZAJE DE APLICACIÓN … 🙂

Aquí está la lista de algunos de los sitios a través de los cuales puede aprender la Programación Dinámica.

1. Programación Dinámica – I – Arjit Srivastava

2. Tutorial de Programación Dinámica.

3. Programación dinámica: desde principiante hasta avanzado

4. ¿Hay buenos recursos o tutoriales para la programación dinámica (DP), además del tutorial de TopCoder? (Originalmente respondida por – Michal Danilák)

Espero que esto pueda ayudarte en Learning Dynamic Programming.

Feliz aprendizaje.

Vaya al tutorial de programación dinámica de TopCoder Programación dinámica: desde principiante hasta avanzado e intente todas las preguntas que se enumeran al final de cada tutorial. Pero antes de eso, te aconsejaré que superes con recursión Una introducción a la recursión, Parte 1 y Una introducción a la recursión, Parte 2 del tutorial de topcoder. Espero que esto ayude. ¡Todo lo mejor!

Todavía soy un principiante en programación dinámica. Me di cuenta de que lo importante es aprender primero los conceptos básicos de la programación dinámica. También aprender cuando la programación dinámica no se debe aplicar. La programación dinámica no es una panacea para todos los problemas. El libro CLRS es muy bueno para aprender lo básico de la programación dinámica.

Para la programación dinámica, primero intente resolver el problema con recursión, que debería ser correcto. Luego, puede optimizar la búsqueda en la recursión.

Una vez, está claro con lo básico, comienza con problemas y trata de buscar 3 atributos en el problema. Y una vez que identificó los subproblemas superpuestos y la estructura recursiva, se gana más de la mitad de la batalla.

Requiere práctica. Puedes aprender del libro CLRS. Practícalo en jueces en línea como topcoder.

Te daré algunos enlaces directos a la programación dinámica.
Tutoriales de algoritmo – Desde el tutorial de programación dinámica del codificador principal, creo que esto le proporcionará suficiente conocimiento sobre el DP. Después de leer este tutorial, le sugiero que resuelva los problemas de CLRS en DP, SPOJ, leetcode, codechef, etc. Para aprender la estructura de datos, recomendaría HackerRank, ya que esto lo llevará al mundo de la programación.

En mi libro, he cubierto la programación dinámica desde la básica hasta la avanzada, en detalle con un capítulo dedicado a los problemas de práctica:

Programación dinámica para entrevistas de codificación

No puedo decirle cómo dominar el DP, pero si desea poder resolver cómodamente los problemas del DP medio, solo necesita resolver muchos problemas del DP.

La mayoría de los problemas de DP que no son demasiado difíciles no inventan nuevos estados o transiciones, son una variación de problemas estándar o antiguos. Todo lo que necesita es conocerlos y comprenderlos lo suficientemente bien como para que pueda modificarlos cuando sea necesario.

Por supuesto, debes hacerlo después de leer un tutorial o un libro. Hay muchos para DP, solo busca en Google y encuentra el que más te guste.

Puede registrarse en HackerEarth, que es uno de los mejores sitios web para practicar diferentes metodologías de programación. Puede aprender la Programación dinámica allí en la sección Code Monk y también practicar sobre los diversos problemas que se proporcionan allí en la categoría de Programación dinámica.

Si solo está interesado en practicar DP, puede consultar sitios web como HackerRank, TopCoder, CodeChef o CodeForces para una gran cantidad de problemas que mejorarán sus habilidades en DP.

Algorithm Design by Klienberg es un buen recurso para la programación dinámica. Geeksforgeeks Dynamic Programming Archives – GeeksforGeeks es un excelente sitio web para aprender DP.Pero confía en mí, sin tener que codificar los algoritmos DP, no tendrás una buena idea de ello. Si lo deseas para saber por qué funciona mejor que la fuerza bruta, es mejor codificar que aprender teóricamente

El mejor libro para aprender estructuras de datos se considera “Introducción a los algoritmos” (o popularmente conocido como CLRS).

También puede consultar el manual de diseño de algoritmos de Skienna. Ambos están teniendo una forma diferente de tratar el tema. Así que elige lo que sea cómodo para ti.
Mi preferencia personal es CLRS.