Programación dinámica sobre subconjuntos usando máscaras de bits
Las restricciones deberían darle la idea de que se espera algún tipo de solución exponencial. En tales problemas, lo habitual es la programación dinámica sobre subconjuntos utilizando máscaras de bits.
Definir mejor (i, S) = cantidad mínima de dinero requerida para matar a los primeros i gangsters usando mercenarios del conjunto S. mejor (N, {1 … 10}) es lo que necesitamos descubrir. Necesitamos encontrar una relación de recurrencia para mejor.
- Cómo medir la precisión de un algoritmo de planificación de ruta
- ¿Es posible aprender estructuras de datos y algoritmos en un mes?
- ¿Cómo funcionará este caché asociativo con el algoritmo de reemplazo de LRU?
- ¿Por qué Python es realmente más lento en algunos cálculos que Java? Las profundidades recursivas también son limitadas.
- ¿Qué algoritmo de clasificación es eficiente para grandes datos y por qué?
Tenga en cuenta que i’th gangster tiene que ser asesinado por algún mercenario presente en S. Deje que el mercenario asignado sea j. Pero entonces, las limitaciones del problema exigen que j solo pueda matar una secuencia contigua de gángsters, digamos k … i. Esto implicaría pagar la suma (costo (j, k … i)) a j. Además, los gángsters k-1 restantes deberán ser asesinados por mercenarios del conjunto S \ {j}. Necesitamos elegir los valores de j y k que nos den la mejor respuesta.
Es decir,
mejor (i, S) = max sobre todo j en S max sobre todo k tal que 0 <k≤i suma (costo (j, k ... i)) + mejor (k-1, S \ {j})
Los casos base de la recurrencia son: mejor (0, S) = 0, mejor (i, ϕ) = inf para i> 0.
La respuesta requerida se puede encontrar usando estos mediante programación dinámica. Se necesitará la memorización si la evaluación se realiza de forma recursiva y los subconjuntos se pueden tratar fácilmente con máscaras de bits.