Dada una cuadrícula N-por-M llena de números positivos, ¿cuál es el mejor programa para encontrar la ruta de arriba a la izquierda a la derecha que minimiza la suma de todos los números?

Deje que [math] A [/ math] sea la matriz de costos. Construiremos [math] B [/ math] con las mismas dimensiones que [math] A [/ math] de modo que [math] B_ {i, j} [/ math] proporcione el costo de la ruta más barata desde la esquina superior izquierda de [matemáticas] A [/ matemáticas] a [matemáticas] i, j [/ matemáticas]. Defina [matemáticas] B_ {0, j} = B_ {i, 0} = 0 [/ matemáticas]. Debido a que los únicos movimientos permitidos son ir hacia abajo y hacia la derecha, la única forma de llegar a una celda es desde arriba o desde la izquierda. Por lo tanto, la forma más barata de pasar por una celda es el costo de la celda más el mínimo de las formas más baratas de llegar a su vecino superior y a su vecino izquierdo. Más formalmente, [matemáticas] B_ {i, j} = min (B_ {i-1, j}, B_ {i, j-1}) + A_ {i, j} [/ matemáticas]. Esto sugiere inmediatamente el orden en que se completa [math] B [/ math] y, por definición, [math] B_ {n, m} [/ math] dará el costo de la ruta más barata desde la parte superior izquierda a la parte inferior derecha .

Si se permiten todos los movimientos en una cuadrícula conectada a cuatro, puede definir un gráfico en las celdas de la matriz de costos, con bordes dirigidos entre todas las celdas adyacentes [matemáticas] a [/ matemáticas] y [matemáticas] b [/ matemáticas] que tienen peso [matemática] A [b] [/ matemática] (esto es para el borde de [matemática] a [/ matemática] a [matemática] b [/ matemática]; de [matemática] b [/ matemática] a [matemática] a [/ math] tiene peso [math] A [a] [/ math]). Ejecute Dijkstra en este gráfico para obtener la ruta deseada.

(Nota: no estoy seguro de si este tipo de problemas de tarea / rompecabezas de la empresa son para lo que Quora es. Tal vez tenga una regla que diga “Responda como si fuera un TA para la clase”)

La mayoría de la gente piensa primero en usar la programación dinámica de manera directa en la matriz original. Deberías probar eso y / o revisar las veces O para ver que lleva mucho tiempo incluso en algo así como una matriz de 25 × 25.

Un mejor método es usar programación dinámica para almacenar en caché los resultados, comenzando desde la parte inferior derecha. Construya la matriz de caché considerando cómo usar los vecinos de una celda de manera más efectiva y luego su respuesta estará en la celda superior izquierda de la matriz de caché.

Una explicación más profunda:
Instanciar una matriz de caché C que también es NxM st C (N, M) = B (N, M).
Ahora, recorra las celdas de B de la siguiente manera. Comience con la celda en (N, M) y avance hacia atrás a lo largo de esa fila hasta llegar a (N, 1). Luego comience nuevamente en (N-1, M) y haga lo mismo.
Mientras realiza el bucle, haga lo siguiente:
si la celda B (J, K) no tiene vecinos, entonces continúe.
si la celda B (J, K) no tiene vecino debajo de ella, entonces C (J, K) = B (J, K) + B (J, K + 1).
si la celda B (J, K) no tiene vecino a su derecha, entonces C (J, K) = B (J, K) + B (J + 1, K).
finalmente, si la celda B (J, K) tiene un vecino a su derecha y debajo de ella, entonces C (J, K) = B (J, K) + Min (C (J, K + 1), C (J + 1, K)).

Cuando haya terminado, habrá construido una matriz que tiene todas las rutas máximas a partir de cualquier celda. Su respuesta será el número en la esquina superior izquierda.

More Interesting

En un algoritmo, ¿cuál es el significado real de la complejidad del espacio?

Actualmente estoy en USACO Gold, pero apenas puedo resolver nada. ¿Qué debo hacer para ser más competente? ¿Dominar el oro es solo una cuestión de aprender toneladas de algoritmos, o necesita más que eso?

Cómo acceder a la raíz de un árbol binario si está almacenado en una estructura

¿Soy un mal programador si no puedo entender Towers of Hanoi?

Cómo hacer un sistema de filtrado colaborativo con Django como back-end

¿Hay algún caso donde alguien de alguna manera descifró el algoritmo y engañó en el IITJEE?

Cómo demostrar que O (f (n) - g (n)) no es necesariamente igual a O (f (n)) - O (g (n))

¿Cómo se implementan las estructuras matemáticas básicas como +, -, *, / en los lenguajes de programación?

¿Dónde puedo conectarme en línea para estudiar estructuras de datos, como árboles de búsqueda binarios, montones, etc.?

¿Es necesario aprender matemáticas discretas antes de comenzar a aprender la estructura de datos y el algoritmo? ¿Y cuál será el mejor libro para hacer lo mismo?

¿El uso de algoritmos en una clave de contraseña típica de 256 bits que siempre está cambiando pero que aún se muestra al usuario (como en un teléfono, por ejemplo) para crear código requeriría supercomputadoras más rápidas disponibles para superarlo?

Conozco la implementación básica de diferentes estructuras de datos como árboles, gráficos, colas y muchos más para inserción, eliminación, recorrido. Ahora, ¿cómo procedo a construir un sistema operativo?

¿Cuáles son los diferentes métodos utilizados para representar el árbol binario?

¿De dónde debería comenzar a aprender el algoritmo? ¿Debería unirme a uno de los MOOC disponibles o leer libros como 'Introducción a los algoritmos'?

Cómo mostrar un problema es NP completo