Discusion de problemas
D - The Coin Change Problem
Podemos pensar este problema de forma top-down, es decir, definiendo bien una función recursiva que nos permita calcular la solución solo llamando al caso de más arriba.
Tiene todo el sentido del mundo definir nuestra función recursiva con argumento \(k\) el monto a cambiar, luego queremos algún otro parámetro que nos dé la información de las monedas que podemos usar. Así si definimos
Notemos que hay dos opciones, o agregar la moneda \(\text{monedas}[i]\) al cambio, lo que nos baja el monto a \(k - \text{monedas}[i]\) o no decidir no seguir agregando esta moneda y seguir con las monedas anteriores.
Ahora tenemos que definir los casos base, que son:
- Que no quede monto a cambiar
- Que ya no nos queden monedas a usar
- Que estemos regresando más dinero del que nos dieron
Luego utilizamos una memorización para guardar los resultados de las llamadas recursivas. La complejidad es de \(O(n \cdot k)\).
C - Caesar's Legions
Similar al problemas de las monedas, lo podemos pensar de forma recursiva. Tomamos como intuición;pararnos en un estado y ver de cuales son las formas en que se puede continuar creando las filas hermosas.
Definamos nuestra función como:
Por ejemplo si tenemos de momento:
donde \(\{...\}\) es el resto de la fila que falta por completar. La función que lo completa seria:
La función recursiva seria:
Los casos bases son:
- Que no queden solados de infantería o a caballo
La solución entonces es:
Utilizando programación dinámica, basta ocupar un array de 4 dimensiones para guardar los resultados de las llamadas recursivas.
int dp[n_1][n_2][12][2];
La complejidad es de \(O(n_1 n_2 \cdot 12 \cdot 2)\).
E - Mixtures
Notar que el color no cambia segun el orden de mezclar las sustancias. Haremos un arreglo de sumas acumuladas para poder calcular el costo de mezclar un rango de sustancias en \(\mathcal{O}(1)\).
El color de mezclar \(i\) a \(j\) es:
Ahora esto nos ayudara a calcular la cantidad de humo que se libera si mezclamos \((0, i]\) con \([i+1, n)\):
Entonces podemos pensarlo de manera recursiva:
Le sumamos \(100\) a cada lado para evitar problemas con los módulos. Puede suceder que nos quede un modulo negativo debido a que estamos restando.
Los casos base son: