Problema de recolección de pizza de Winkler:
- Una tarta circular de
n
rebanadas de pizza , donde la rebanadai
tiene áreaS_i
, es decir, el área es diferente para cada trozo de tarta. - Los comedores Alice y Bob se turnan para recoger rebanadas, pero es grosero crear múltiples huecos en el pastel (considere que no está permitido).
- Por lo tanto, cada comedor está restringido a tomar una de las dos rebanadas adyacentes a la región abierta. Alice va primero, y ambos comedores buscan la mayor cantidad de pastel posible.
¿Cómo determinaría un algoritmo de programación dinámica cuánto pastel come Alice, si tanto Alice como Bob juegan perfectamente para maximizar su consumo de pizza?
Mi punto de vista:
En un problema general de DP, seguimos encontrando subproblemas que se pueden visualizar usando el árbol de recursión o, más estrictamente, usando un DAG. Aquí, no encuentro ninguna pista para encontrar los subproblemas aquí.
Aquí, para un conjunto dado de S_i s, necesitamos maximizar el área de rebanadas que come Alice. Esto dependerá de elegir una permutación de porciones de Pizza de (n-1) permutaciones. Elegir una porción de área máxima de dos opciones disponibles en cada n \ 2 turnos que obtiene Alice nos dará el área total de porción para una permutación. Necesitamos encontrar el área de corte para todas esas permutaciones. Y luego el máximo de estos.
¿Alguien puede ayudarme a seguir adelante?
fuente
pizzaAmount
depende de cuáles son los índices de inicio y finalización de las porciones restantes y no de la secuencia de las porciones de pizza que usted y su amigo ya comieron para que pueda almacenar el resultado en un matriz para evitar el recálculo. El orden del algoritmo es, por lo tanto, O (n ** 2).Para parte de la pizza, defina
F(i,j)
como máximo cuánta persona puede comer la primera rebanada. Las porciones de parte de la pizza(i,j)
son:Definir
R(i,j)
(cuánto queda para la segunda persona) comosum(S_x, x in slices(i,j)) - F(i,j)
.Con:
El máximo que Alice puede comer se calcula mediante:
fuente