如何将自上而下的转换为自下而上的DP算法?

时间:2016-04-24 15:32:45

标签: python algorithm recursion bottom-up topdown

我已经创建了一个功能,我虽然这是一个动态编程方法,但我发现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 Bottom-Up方法:(这是我得到的)

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 个答案:

没有答案