Eat Pizza
Given an array of pizza slice sizes. You and a friend are competing to get the most pizza.
The rule is you can pick from either end of the pizza.
You can choose left or right side.
Your friend is greedy. He will always choose the side with a bigger slice.
Calculate the max amount of pizza you can get.
ex:[1, 2, 10, 4, 3, 5, 6]
Your picks: 6 -> 3 -> 10 -> 1 = 20
Opponent picks: 5 -> 4 -> 2 = 11
Core Idea: DP looking two back
Similar to cut wood, treating this as a join problem is much easier than cutting it down.
Using a 2D table we can memoize what is the most pizza we can keep from a I -> J segment
The trick is since we do not control the action of our opponent, we have to look Two Back instead of one since the order is: my move -> opponent move -> my move.
Does that mean we have cover branching twice? No, we don't. The reason is the opponent move is actually determined by our move. All we choose is left or right slice. After that the opponent will always choose the bigger slice after.
TC: O(N^2)
SC: O(N^2)
Last updated
Was this helpful?