【发布时间】:2017-11-14 19:55:52
【问题描述】:
假设您有 N 种葡萄酒并排放置在一个架子上。第 i 种酒的价格是 pi。 (不同酒的价格可能不同)。因为葡萄酒每年都在变好,假设今天是第 1 年,那么在第 y 年,第 i 种葡萄酒的价格将为 y*pi,即 y 乘以当年的价格。 你想卖掉你所有的酒,但你想从今年开始每年只卖一种酒。还有一个限制 - 每年您只能出售货架上最左边或最右边的葡萄酒,并且不允许重新订购货架上的葡萄酒(即它们必须保持与开始时相同的顺序)。 您想知道,如果您以最佳顺序销售葡萄酒,您可以获得的最大利润是多少?
int N; // number of wines
int p[N]; // array of wine prices
int cache[N][N]; // all values initialized to -1
int profit(int be, int en) {
if (be > en)
return 0;
if (cache[be][en] != -1)
return cache[be][en];
int year = N - (en-be+1) + 1;
return cache[be][en] = max(profit(be+1, en) + year * p[be],profit(be, en-1) + year * p[en]);
}
时间复杂度:O(n^2)。 我已经找到了这个 O(n^2) 解决方案。我们可以在 O(n) 中做到吗? (更好的时间复杂度)
【问题讨论】:
-
您能否为上述问题提供一个示例输入和输出?对我来说测试我的代码会更容易,谢谢
-
我假设上述问题的一个例子可能是输入:- 10, 1, 2, 6, 7。所以我挑选要出售的葡萄酒的顺序将是这样的 - 7,6,2,1,10 所以我的总利润将是 = 7*1 + 6*2 + 2*3 + 1*4 + 10*5 = 159。如果我错了请告诉我?
-
@zenwraight 是的。考虑这个例子: p[] = {2, 3, 5, 1, 4} 并且解决方案将是 2 * 1 + 4 * 2 + 1 * 3 + 3 * 4 + 5 * 5 = 50
-
根据我的说法,使用 O(n) 是不可能的,因为那样它不会涵盖所有可能性,dp 和 O(n^2) 似乎只是解决问题的正确方法这个
标签: recursion data-structures dynamic-programming memoization