2
def recursion(self, index, used):8
if (index, used) in self.dp:9
return self.dp[(index, used)]10
# choice1 is using the secret technique11
choice1 = -float("inf")13
# we can only use secret technique once and consecutively15
# use the secret technique16
end = index + self.minutes if index + self.minutes < self.n else self.n17
to_substract = self.prefix_sum[index - 1] if index != 0 else 018
val = self.prefix_sum[end - 1] - to_substract19
choice1 = self.recursion(end, False) + val21
# Do not use the secret tehcnique and play simple22
choice2 = self.recursion(index + 1, used) + (23
self.customers[index] if self.grumpy[index] == 0 else 025
ans = choice1 if choice1 > choice2 else choice227
# Memoization is done here28
self.dp[(index, used)] = ans32
self, customers: List[int], grumpy: List[int], minutes: int34
self.n = len(customers)35
self.customers = customers37
self.minutes = minutes39
self.prefix_sum = [x for x in customers]40
for i in range(1, self.n):41
self.prefix_sum[i] += self.prefix_sum[i - 1]42
return self.recursion(0, True)