¿Cómo se puede comenzar a resolver problemas de programación dinámica?

Mirando la mayoría de los problemas de DP, ¡no parecen ser solucionables usando DP en el primer sitio! Si intentas resolverlo pensando que es un problema de DP, lo más probable es que no lo entiendas.

En cambio, olvídate de DP, ¡aplica la fuerza bruta primero! Entonces, lo más probable es que caigas en la recursión. Felicidades, el trabajo está casi terminado 😀 Ahora, solo mira, ¿si estás haciendo un trabajo repetitivo? ¿Puedes usar alguna matriz o tabla para almacenar el valor de las llamadas de recursión para usarlo más tarde? ¿Cuántos parámetros hay en la llamada de recursión y puede hacer la memorización ahora de acuerdo con el número de parámetros? Lo más probable es que ahora obtenga el problema y lo resuelva 🙂

Ahora, veamos cómo debemos comenzar, si no sabemos nada sobre DP 🙂

  1. Primera y más importante parte, toma ese libro CLRS. Abra su capítulo de programación dinámica, léalo completo y entiéndalo completamente. En él se dan tres problemas básicos de DP: corte de varilla, multiplicación de cadena de matriz y LCS. Comprenda completamente cómo nos hemos acercado a su solución, por qué esta solución funciona, etc., todo.
  2. Ahora, cuando conozca los conceptos básicos de DP, vaya a Algorithms GeeksforGeeks y vea todos los problemas aquí. Estos son todos los problemas de DP más comunes y casi todos los problemas que enfrentará, sería solo la variación de estos problemas.
  3. Ahora, ya ha terminado de recoger todas sus armas, es hora de la guerra 😀 Intente resolver tantos problemas como pueda en jueces en línea como spoj, codechef, hackerearth, hackerrank, etc. Puede encontrar un buen comienzo aquí Juez en línea A2. Intenta resolver desde los más fáciles hasta los más difíciles.
  4. Primero intente su mejor nivel para resolver un problema en particular. No se desanime si no puede resolver ningún problema. Después de hacer todo lo posible, busque su solución en Internet, discuta con sus compañeros, trate de ver cómo se aborda el problema, por qué y cómo su pensamiento era incorrecto, cómo se resolvió, etc. Esta es la única manera de mejorar programación competitiva 🙂
  5. Repita los pasos 3 y 4 😀

Todo lo mejor 🙂

Para obtener la idea básica detrás de la resolución de problemas de DP, vaya a HackerRank y en el dominio de algoritmos, seleccione la programación dinámica y resuelva todos los problemas en la sección fácil y media.

después de eso, ve a A2 Online Judge.

Haga su cuenta y en las categorías de problemas, seleccione la programación dinámica. Contiene una lista completa de problemas DP (con su fuente) que van desde fácil a muy difícil, y resuélvelos.

Además, como referencia lateral, puede consultar GeeksforGeeks | Un portal de informática para geeks y puedes elegir la categoría DP que contiene muchísimos artículos de DP que contienen teoría, así como una enorme cantidad de problemas.

Después de que se haya alimentado con las cosas anteriores, le recomendé que resuelva todos los concursos anteriores de cualquier sitio web de programación competitivo, ya que contienen muchos problemas de DP que vale la pena ver.

En primer lugar, permítanme presentar mi propio proceso de pensamiento para resolver problemas de DP (ya que es corto) y luego lo remito a otras fuentes.

NOTA: Todos los DP se pueden (re) formular como recursividad. El esfuerzo adicional que pones para descubrir cuál es la recursión subyacente será de gran ayuda para ayudarte en futuros problemas de DP.

PASO 1: Imagina que eres DIOS. O como tal, usted es un supervisor del problema en tercera persona.
PASO 2: Como Dios, debes decidir qué elección hacer. Haz una pregunta de decisión .
PASO 3: Para tomar una decisión informada, debe preguntar “¿qué variables me ayudarían a tomar una decisión informada?”. Este es un paso importante y puede que tenga que preguntar “pero esta no es suficiente información, entonces, ¿qué más necesito?”.
PASO 4: Elija la opción que le brinde su mejor resultado.

En lo anterior, las variables aludidas en el Paso 3 son lo que generalmente se llama el “estado” de su DP. La decisión en el Paso 2 se considera como “de mi estado actual, ¿de qué estados depende?”

Confía en mí: he resuelto muchos problemas de CT en DP simplemente usando la metodología anterior. Me tomó aproximadamente un máximo de 2 meses asimilar esta metodología, por lo que, a diferencia de los consejos de “Seguir practicando” de todos (que compararía con el movimiento browniano ), sugiero la “intuición” anterior.

Por cierto, si puedes identificarme por mi consejo, bien por ti. El objetivo de permanecer en el anonimato es principalmente para que las personas no voten a ciegas cuando ven que ” X agregó una respuesta a los Algoritmos : …”


Ahora para algunos ejemplos:

Q. Dada una matriz, encuentre la suma más grande a lo largo de un segmento contiguo de la misma.
Bastante simple, y probablemente conozca la respuesta, pero veamos a qué equivalen los 4 pasos.
Paso 1: soy un supervisor (solo un paso psicológico)
Paso 2: Reviso la matriz y pregunto: ” ¿comienza la suma más grande en este punto?
Paso 3: Necesito saber cuál es la suma más grande que comienza en el siguiente punto, para decidir si se puede extender o no.
Paso 4: O lo extiendo al siguiente punto, o lo corto aquí: f (i) = max (arr [i], arr [i] + f (i + 1)).

El ejemplo particular anterior me lo demostró un amigo y antes de su demostración (de lo fácil que es DP), los DP me desconcertaron por completo.


P. Tengo un conjunto de N trabajos y dos máquinas A y B. El trabajo i toma A [i] tiempo en la máquina A y B [i] tiempo en la máquina B. ¿Cuál es la cantidad mínima de tiempo que necesito para terminar? todos los trabajos?
Paso 1 : Soy el supervisor (este problema se presta más naturalmente a ser “Dios”).
Paso 2: paso por los trabajos del 1 al N, y tengo que decidir en qué máquina programar el trabajo i .
Paso 3 : si programo el trabajo en la máquina A , entonces tengo una carga de A [i] + la mejor manera de programar los trabajos restantes. Si está en B, entonces tengo una carga de B [i] + la mejor manera de programar los trabajos restantes.
¡Pero espera! La “mejor manera de programar los trabajos restantes” no tiene en cuenta el hecho de que el iésimo trabajo potencialmente interferirá. Por lo tanto, necesito transmitir también la “carga total” en cada máquina para hacer mi elección informada.
Por lo tanto, necesito modificar mi pregunta a: ” Dado que la carga actual en A es a , y en B es b , y tengo que programar los trabajos i a N, ¿cuál es la mejor manera de hacerlo?
Paso 4: f (a, b, i) = {max (a, b): i == N + 1, de lo contrario min (f (a + A [i], b, i + 1), f (a, b + B [i], i + 1): i <= N}. La respuesta final está en f (0, 0, 1).


Ahora, suficientes ejemplos (la respuesta se está volviendo demasiado larga). Si tiene alguna pregunta sobre DP en la que desea que haga mi magia, publíquela como comentario comment

Por favor, eche un vistazo a las respuestas de Mimino en DP: ¿Cuáles son las formas sistemáticas de prepararse para la programación dinámica?

Estaba enfrentando el mismo problema que tú. La siguiente estrategia me fue útil, aunque no soy un experto en DP pero ahora puedo resolver viejas soluciones div 1 500/1000 dp.
La siguiente es mi estrategia:

1. Comience con la recursividad porque la recursividad construye la intuición básica para los problemas de DP. Puede comenzar desde aquí: Estadísticas de TopCoder – Archivo de problemas

Si usted es un principiante en la programación, puede comenzar desde aquí:
Estadísticas de TopCoder – Archivo de problemas

2. Después de haber realizado el primer paso, tiene una plataforma básica para iniciar DP. Así que lea esto por vortys TopCoder Feature Articles

NOTA: Al principio, puede encontrar el DP tabular difícil, por lo que le aconsejaré que comience con la memorización + recursividad (que aprenderá durante el paso 2)
Después de resolver algunos problemas, el DP tabular será más fácil.

BUENA SUERTE

DP (programación dinámica) es un tema conceptual que siempre es un tema de tendencia en cualquier concurso de programación competitiva. Ahora surge la pregunta de cómo resolver las preguntas, ya que siempre hay una o dos preguntas en cualquier concurso de CP (¡o puede que no!).

Vamos a dividirlo en puntos y formar una estrategia para resolverlo: –

  1. La programación dinámica (también conocida como optimización dinámica ) 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: – [1] Wikipedia), así que básicamente dice que DP consta de dos partes, primero, dividir un problema dado en una parte más pequeña (subproblema) y segundo recordar el resultado del subproblema más pequeño para obtener el resultado deseado.
  2. Ahora, sí, la definición siempre es muy fácil de entender y hacer un seguimiento. ¿Pero cómo resolver el problema relacionado con él en el concurso? Para eso, personalmente recomendaría Practical DP tanto como sea posible 😉
  3. Pero, Primero, para resolver el problema, primero debe obtener una referencia básica sobre cómo resolver dicho problema. Para eso hay varios sitios de tutoría como: –
  • Algoritmos – GeeksforGeeks
  • Tutorial para programación dinámica
  • Programación dinámica: de principiante a avanzado

Ahora, ya que puede haber aprendido y ver algunos tutoriales, ¿qué hacer ahora?

Simplemente comience a codificar, ¡NADIE EN EL MUNDO PODRÍA ENSEÑARLE CODIFICAR A MENOS QUE HAYA QUE NO COMIENCE A PRACTICARLO!

Por lo tanto, creo que la mejor manera de comenzar a codificar es buscar etiquetas para DP, ¡o hackerrank proporciona una categoría separada para ello!

  • Resolver desafíos de código de algoritmos

PD: ¡Feliz codificación!

Notas al pie

[1] Programación dinámica – Wikipedia

Si ha seguido tutoriales en topcoder o fuerzas de código, entonces podría haber probado los ejemplos
Después de esto . Por lo general, dan algunos problemas de muestra al final de los tutoriales. Pruebe esos después de resolver ejemplos.

Puede consultar cualquier libro si lo desea, recomendaría Introducción a los algoritmos de Cormen.

Para obtener más preguntas, puede ir a A2OJ.com donde se clasifican todas las preguntas en todas las plataformas.

Use la etiqueta # programación dinámica en spoj y puede leer comentarios para tener una idea de la dificultad del problema.

Espero que esto ayude.

Feliz codificación.