En problemas de DP, ¿cómo sabe si usar una matriz / tabla 1D o una matriz / tabla 2D?

Al escribir un programa recursivo o basado en bucles para resolver un problema, en cada llamada recursiva o iteración de bucle nos preocupa cómo llegar a la solución a nuestro problema actual desde la (s) solución (es) hasta uno o más subproblemas.

Ahora, en DP, de una forma u otra, está reduciendo la entrada de su problema a algo que puede usar como índice de matriz. La pregunta es si puede representar adecuadamente la entrada del problema como un índice de matriz única o si necesita más de un índice. (Sí, podría jugar y encontrar formas de codificar múltiples índices en un número, pero no queremos pasar por contorsiones extrañas como esas si pudiéramos usar dos índices en su lugar).

Siempre me resulta más fácil olvidarme brevemente de DP y simplemente formular la solución primero como una función recursiva (probablemente en pseudocódigo) cuyo significado puedo describir en una oración. (Por cierto, esta también es una buena manera de saber si DP es necesario en primer lugar; la característica fundamental de un problema de DP es que puede terminar haciendo llamadas recursivas en las mismas entradas más de una vez). Si puedo escribir un función de un argumento, entonces tengo buenas razones para creer que puedo usar un índice, por lo tanto, una matriz 1-D. Si no puedo hacerlo con uno, es posible que necesite dos argumentos, lo que significa que necesito una matriz 2-D. Si necesito tres, entonces necesito una matriz 3-D. Y así.

Para un ejemplo de requerir dos índices: en el problema de la distancia de edición, estamos viendo dos cadenas s1 y s2, y en cualquier llamada dada (si funciona de forma recursiva) o iteración de bucle, debemos ser conscientes de alguna posición en s1 y alguna posición en s2. Por lo tanto, tiene sentido usar dos índices.

Un apéndice, provocado por la discusión en los comentarios: no hay sustituto para resolver el problema a mano , en papel o en un tablero, para entradas de ejemplo simples . Esto le dirá con bastante rapidez si puede salirse con una entrada o si necesita dos (o tres).

Cuando analiza un problema, lo que realmente busca es una función con cierto número de parámetros que representen un estado . Luego intenta relacionar el estado actual con algunos estados anteriores de la función. Si puede hacer esto, y puede calcular algún estado de la función a mano (en otras palabras, si hay un estado de la función para el que conoce el valor), la función está completamente definida y puede calcularla para cualquier Estado que quieras. El número de parámetros no importa y no le dice nada sobre la dificultad del problema. El número de parámetros depende del problema. Ahora, si tiene un parámetro que describe el estado (por ejemplo, números de Fibonacci), usa una matriz 1-D. ¿Por qué? Como arr [0] representa el valor de la función para el estado 0, arr [1] representa el valor de la función para el estado 1 y así sucesivamente. Si tiene k parámetros que representan el estado de la función, entonces tiene una matriz k-dimensional y arr [x1] [x2] [x3] [..] [xk] representa el valor de la función para el estado (x1, x2 , x3, .., xk). Las únicas cosas que realmente importan son estas:

representación de un estado (por algún número de parámetros)
relacionar un estado con otros estados (idear una transición entre estados)

La recursión calcula los valores de la función en algún estado sobre la marcha y en DP realmente los almacena porque desea evitar el recálculo y eso es todo. Espero que esto ayude.

More Interesting

¿Hay alguna relación de recurrencia famosa aparte de Fibonacci?

¿Por qué el aprendizaje profundo requiere la construcción de modelos de datos generativos?

¿Puedo comenzar a aprender visión por computadora sin pasar por algoritmos de aprendizaje automático?

¿Cómo calcular la permutación inversa en un estilo de programación funcional?

C: ¿Existe un enfoque general para convertir una función recursiva en iterativa y viceversa?

¿Cómo podemos demostrar que el reconocimiento de objetos basado en la visión es un problema np completo?

Cómo resolver la siguiente recursividad usando el árbol de recursión

¿Cuál es una versión más amigable para principiantes de CLRS para algoritmos de aprendizaje? ¿Estaría rompiendo la entrevista de codificación?

¿Cuál es la estrategia de divide y vencerás? Escribe un algoritmo para encontrar x a la enésima potencia usando el método de dividir y conquistar.

Suponiendo una memoria infinita, ¿siempre es posible aumentar la complejidad de cualquier programa sin introducir redundancia?

Dado un problema, como un problema de diseño o un problema de algoritmos, ¿cómo resolverá un ingeniero de software experimentado ese problema?

¿Cuáles son los componentes o algoritmos de subsistema mejor diseñados en Linux?

¿Cuál es la relación entre la complejidad del algoritmo y la complejidad del software?

Cómo encontrar los diferentes números de subconjuntos contiguos de una matriz usando Java

Con los algoritmos de cifrado modernos, ¿es factible que alguien sepa qué algoritmo se utilizó al mirar el texto cifrado?