Как преобразовать нисходящий алгоритм DP?
Я создал функцию, о которой я думаю, что это подход динамического программирования, но я обнаружил, что DP
может быть снизу вверх, но эта функция сверху вниз. Теперь я пытаюсь преобразовать эту функцию в Bottom-Up
, У вас есть какие-нибудь намеки?
Есть 3*n
яблоки (3,6,9.. или 81..) и 3 покупателя. Каждый покупатель может купить каждое яблоко по разной цене. Вводится список (яблок) цен. [[1,2],[4,5]]
означает, что первое яблоко может быть продано за 1$ первому покупателю и за 2$ второму покупателю.
Функция возвращает лучшую цену, которую вы можете заработать.
Единственное, что я хочу - это преобразовать его из Top-Down
в Bottom-up
поэтому я могу использовать динамическое программирование, но у меня нет успеха.
apples = [[1,50,1], [1,50,1], [1,80,50]] (3 apples for example)
results = {}
def sell_apples(buyer1, buyer2, buyer3):
global results
if (buyer1,buyer2,buyer3) in results.keys(): # memoization
return results[(buyer1,buyer2,buyer3)]
n = sum([buyer1, buyer2, buyer3])
if buyer1 == buyer2 == buyer3 == 0 or n == 0:
return 0
os = []
for i in range(3):
buyers = [buyer1, buyer2, buyer3]
if buyers[i] > 0:
buyers[i] -= 1
os.append(sell_apples(*buyers) + apples[n - 1][i])
m = max(os)
results[(buyer1,buyer2,buyer3)]=m # memoization
return m
Подход DP снизу вверх: (насколько я понимаю)
def sell_apples_bottom_up(buyer1,buyer2,buyer3):
n = sum([buyer1, buyer2, buyer3])
def sabu(buyer1,buyer2,buyer3):
if all(x==0 for x in [buyer1,buyer2,buyer3]):
return 0
os = []
for i in range(3):
buyers = [buyer1,buyer2,buyer3]
if buyers[i]>0:
buyers[i] -= 1
os.append(sabu(*buyers))
m = max(os)
return m
# LOST HERE