【发布时间】:2017-01-16 01:27:19
【问题描述】:
我最近开始学习动态编程,发现了以下问题:
想象一下,您在一个架子上放置了 N 种葡萄酒的集合。为简单起见,让我们分别用 1 到 N 的整数为葡萄酒站在货架上时从左到右编号。第i个酒的价格是pi(不同酒的价格可以不同)。
因为葡萄酒每年都在变好,假设今天是第 1 年,那么第 y 年第 i 种葡萄酒的价格将是 y*pi,即当年价值的 y 倍。
你想卖掉你所有的酒,但你想从今年开始每年只卖一种酒。还有一个限制 - 每年您只能出售货架上最左边或最右边的葡萄酒,并且不允许重新订购货架上的葡萄酒(即它们必须保持与开始时相同的顺序)。
您想知道,如果您以最佳顺序销售葡萄酒,您可以获得的最大利润是多少。
答案是自上而下的方法,我想创建一种自下而上的方法。以下是我对问题的定义:
F(l,r) 是从指定的左右索引中挑选葡萄酒所产生的利润函数
输入:p 是葡萄酒价格的数组
F(l,r) = max(年 * p[l] + F(l+1,r) * (年+1), 年 * p[r] + F(l,r-1) * (year+1))
约束:l+r
我创建了以下 Python 代码来解决这个问题
def wine(Price):
length = len(Price)
DP = [[0] * (length+1) for _ in range(length+1)]
for y in range(1,length+1): #Or can be range(length, 0, -1):
for l in range(0, length):
for r in range(length-1, -1, -1):
if l+r <= length:
DP[l][r] = max(y * Price[l] + DP[l+1][r] * (y+1), \
y * Price[r] + DP[l][r-1] * (y+1))
return DP
我已将 Price 数组设置为 [2,3,5,1,4]。消息来源表明 Max Profit 是 50。但是,我无法用我编写的代码识别该值。有人可以帮助确定我的逻辑问题吗?
【问题讨论】:
标签: python dynamic-programming