← Euler Lab
#015

Caminos en una Cuadrícula

Cargando Python...

Lattice Paths

Partiendo de la esquina superior izquierda de una cuadrícula de 2×2, y pudiendo moverse solo hacia la derecha o hacia abajo, hay exactamente 6 rutas hacia la esquina inferior derecha.

¿Cuántas rutas hay en una cuadrícula de 20×20?

Combinatoria Programación Dinámica Triángulo de Pascal

1 Visualizando el Problema

Empecemos con el caso pequeño: una cuadrícula de 2×2 tiene exactamente 6 caminos posibles. Cada camino requiere 2 movimientos hacia la derecha y 2 hacia abajo.

Los 6 caminos en una cuadrícula 2×2:

R R D D
R D R D
R D D R
D R R D
D R D R
D D R R

El Insight Clave

Observa algo crucial: todos los caminos tienen la misma longitud. Para ir de (0,0) a (2,2) necesitas exactamente:

→ →
2 pasos a la derecha
↓ ↓
2 pasos abajo

Un camino no es más que una secuencia de 4 movimientos: 2 son R (derecha) y 2 son D (abajo).

La pregunta se transforma: ¿De cuántas formas podemos ordenar RRDD?

Reformulando el problema

Grid 2×2
4 posiciones, elegir 2 para "R"
C(4,2) = 6 caminos
Grid 20×20
40 posiciones, elegir 20 para "R"
C(40,20) = ???

Conexión con el Triángulo de Pascal

C(n,k) son exactamente los números del triángulo de Pascal. Para n=4, k=2:

1
1
1
1
2
1
1
3
3
1
1
4
6
4
1

Fila 4, posición 2: C(4,2) = 6

Caminos en grid 20×20
137,846,528,820
Fórmula
C(40, 20)

2 Programación Dinámica (DP)

Antes de usar la fórmula directa, veamos cómo resolverlo con programación dinámica. Esta técnica es fundamental en algoritmos y tiene aplicaciones mucho más amplias.

La Idea Central de DP

Pregunta clave: ¿Cuántos caminos hay para llegar a cada celda?

Para llegar a cualquier celda (i, j), solo puedes venir de:

  • Arriba: celda (i-1, j)
  • Izquierda: celda (i, j-1)
caminos(i, j) = caminos(i-1, j) + caminos(i, j-1)

Construyendo la tabla (grid 3×3):

1
1
1
1
1
2
3
4
1
3
6
10
1
4
10
20

Bordes = 1 camino Esquina final = 20 caminos

¿Por qué los bordes son siempre 1?

Para llegar a cualquier celda del borde superior, solo puedes ir hacia la derecha: → → → →
Para llegar a cualquier celda del borde izquierdo, solo puedes ir hacia abajo: ↓ ↓ ↓ ↓

Solo hay un único camino posible para cada celda del borde.

Python — Programación Dinámica
// Output aparecerá aquí

Análisis de Complejidad

Tiempo
O(n²)

Llenamos una tabla de (n+1)×(n+1)

Espacio
O(n²)

Almacenamos toda la tabla

Optimización posible: Solo necesitamos la fila anterior para calcular la actual, así que podríamos reducir el espacio a O(n). Pero para n=20, O(n²) es perfectamente aceptable.

Python — DP Optimizado (O(n) espacio)
// Output aparecerá aquí
Programación Dinámica Tabla de subproblemas Optimización de espacio

3 Fórmula Combinatoria Directa

La programación dinámica es elegante, pero existe una solución O(n) que usa directamente el coeficiente binomial. Es la forma más eficiente de resolver este problema.

Fórmula del coeficiente binomial
C(n, k) = n! / (k! × (n-k)!)
Para un grid n×n: C(2n, n)

¿Por qué C(2n, n)?

Para un grid n×n necesitamos:

  • n movimientos hacia la derecha (R)
  • n movimientos hacia abajo (D)
  • 2n movimientos en total

Un camino es una secuencia de 2n movimientos donde elegimos cuáles n son "R".

Ejemplo grid 2×2:

Posiciones: 1 2 3 4

Elegir 2 para "R": {1,2}, {1,3}, {1,4}, {2,3}, {2,4}, {3,4}

Caminos: RRDD, RDRD, RDDR, DRRD, DRDR, DDRR

C(4,2) = 6 ✓

Python — math.comb (Python 3.8+)
// Output aparecerá aquí
Python — Cálculo manual (sin math.comb)
// Output aparecerá aquí

Comparación de Métodos

Método Tiempo Espacio Uso
DP (tabla) O(n²) O(n²) Didáctico
DP optimizado O(n²) O(n) Memoria limitada
math.comb O(n) O(1) Óptimo

C(2n, n): El Número Central de Catalan

C(2n, n) es el número central de la fila 2n del triángulo de Pascal. Es el más grande de su fila y aparece en muchos problemas de combinatoria:

  • Caminos en cuadrículas (este problema)
  • Formas de subir escaleras
  • Secuencias balanceadas de paréntesis (relacionado con Catalan)
  • Aproximación de π (fórmula de Wallis)
Coeficiente binomial math.comb Reformulación combinatoria Triángulo de Pascal