Problem zbierania pizzy przez Winklera:
- Okrągłe ciasto do pizzy z
n
plasterkami, w którym plastereki
ma powierzchnię,S_i
tj. Powierzchnia jest inna dla każdego kawałka ciasta. - Zjadacze Alice i Bob na zmianę wybierają plastry, ale niegrzeczne jest tworzenie wielu luk w cieście (uważaj to za niedozwolone).
- Zatem każdy zjadacz jest ograniczony do wzięcia jednego z dwóch plasterków sąsiadujących z otwartym obszarem. Alice jest pierwsza i obaj jedzą tyle ciastek, ile to możliwe.
W jaki sposób algorytm programowania dynamicznego określiłby, ile ciasta zjada Alice, jeśli zarówno Alice, jak i Bob grają idealnie, aby zmaksymalizować zużycie pizzy?
Moje zrozumienie:
W ogólnym problemie DP idziemy dalej do znajdowania podproblemów, które można wizualizować za pomocą drzewa rekurencji lub, ściślej, za pomocą DAG. Tutaj nie znajduję żadnej wskazówki, by znaleźć tutaj pod-problemy.
Tutaj, dla danego zestawu S_i, musimy zmaksymalizować obszar plasterków zjadanych przez Alice. Będzie to zależeć od wyboru permutacji plasterków pizzy spośród permutacji (n-1). Wybranie wycinka o maksymalnej powierzchni spośród dwóch opcji dostępnych w każdych n \ 2 ruchach, jakie otrzyma Alice, da nam całkowitą powierzchnię odcięcia dla permutacji. Musimy znaleźć obszar plasterka dla wszystkich takich permutacji. A potem maksimum z nich.
Czy ktoś może mi pomóc, jak iść naprzód?
źródło
pizzaAmount
nie zależy tylko od tego, jaki jest indeks początkowy i końcowy pozostałych plasterków, a nie od kolejności, w której plasterki pizzy zjadłeś już Ty i Twój przyjaciel, więc możesz zapisać wynik w macierz, aby uniknąć ponownego obliczenia. Kolejność algorytmu wynosi zatem O (n ** 2).Dla części pizzy określ
F(i,j)
jako maksymalną liczbę osób, które może zjeść pierwszy plasterek. Plastry części pizzy(i,j)
to:Zdefiniuj
R(i,j)
(ile pozostało drugiej osobie) jakosum(S_x, x in slices(i,j)) - F(i,j)
.Z:
maksymalna, jaką Alicja może zjeść, obliczana jest przez:
źródło