Problema de escolha de pizza de Winkler:
- Uma pizza circular de
n
fatias de pizza , onde a fatiai
tem áreaS_i
, ou seja, a área é diferente para cada pedaço de pizza. - Comedores Alice e Bob se revezam escolhendo fatias, mas é rude criar várias lacunas na torta (considere isso não permitido).
- Assim, cada comedor é restrito a tomar uma das duas fatias adjacentes à região aberta. Alice vai primeiro, e os dois comedores buscam o máximo de torta possível.
Como um algoritmo de programação dinâmica determinaria a quantidade de torta que Alice come, se Alice e Bob jogam perfeitamente para maximizar seu consumo de pizza?
Meu entendimento:
Em um problema geral de DP, avançamos na busca de subproblemas que podem ser visualizados usando a árvore de recursão ou, mais precisamente, usando um DAG. Aqui, não estou encontrando nenhuma pista para encontrar os subproblemas aqui.
Aqui, para um determinado conjunto de S_i s, precisamos maximizar a área de fatias comidas por Alice. Isso dependerá da escolha de uma permutação de fatias de pizza dentre (n-1) permutações. A escolha de uma fatia máxima da área dentre duas opções disponíveis a cada n \ 2 turnos que Alice obtém nos fornecerá a área total da fatia para uma permutação. Precisamos encontrar a área da fatia para todas essas permutações. E então o máximo disso.
Alguém pode me ajudar em como avançar?
fonte
pizzaAmount
depende apenas do índice inicial e final das fatias restantes e não da sequência de quais fatias de pizza você e seu amigo já comeram, para que você possa armazenar o resultado em um matriz para evitar recomputação. A ordem do algoritmo é, portanto, O (n ** 2).Para parte da pizza, defina
F(i,j)
como máximo o quanto a pessoa que escolhe primeiro a fatia pode comer. Fatias de parte da pizza(i,j)
são:Defina
R(i,j)
(quanto resta para a segunda pessoa) comosum(S_x, x in slices(i,j)) - F(i,j)
.Com:
o máximo que Alice pode comer é calculado por:
fonte