Как преобразовать нисходящий алгоритм 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

0 ответов

Другие вопросы по тегам