这个问题(最后一个)出现在比荷卢算法编程竞赛2007中
http://www.cs.duke.edu/courses/cps149s/spring08/problems/bapc07/allprobs.pdf
公司需要弄清楚何时 - 在给定输入上购买或出售或无操作以便最大化利润的策略。输入格式为:
6
4 4 2
2 9 3
....
....
表示输入为6天。
第1天:您获得4股,每股价格为4美元,最多可以卖出2股
第2天:您获得2股,每股价格为9美元,最高可以卖出3股
我们需要输出可以实现的最大利润。
我正在思考如何解决这个问题。在我看来,如果我们施加蛮力,那将花费太多时间。如果这可以转换为某些DP问题,如0-1背包?一些帮助将受到高度赞赏。
答案 0 :(得分:0)
它可以通过DP解决
假设有n天,股票总数是m
让f [i] [j]表示,在第i天,剩余j股,最大利润为f [i] [j]
显然,f [i] [j] =最大值(f [i-1] [j + k] + k * price_per_day [i]),0< = k< = maximum_shares_sell_per_day [i]
可以进一步优化,因为f [i] [...]仅取决于f [i-1] [...],这里可以使用滚动阵列。因此你只需要定义f [2] [m]来节省空间。
总时间复杂度为O(n * m * maximum_shares_sell_per_day)。
也许可以进一步优化以节省时间。欢迎任何反馈
答案 1 :(得分:0)
您的描述与PDF中的最后一个问题不完全匹配 - 在PDF中您收到第一列中指定的份额数(或被迫购买它们 - 因为没有决定使其无关紧要)并且只能决定要卖多少股票。由于它没有另外说明,我认为不允许卖空(否则忽略除价格之外的所有东西,并在衍生品市场上赚到这么多钱,你可以贿赂SEC或国会并退休: - ))。
这看起来像一个动态程序,其中每个时间点的状态是您手头拥有的总股数。因此,在时间n,您有一个数组,其中包含一个元素,用于您当时可能已经结束的每个可能的共享数量,并且在该元素中,您可以获得最大金额,然后以该数字结束股份。从这里你可以计算出时间n + 1的相同信息。当你到达终点时,你所有的股票都毫无价值,所以最好的答案是与最高金额相关的答案。
答案 2 :(得分:0)
我们不能做出比以最高价格出售我们当天可以获得的最大份额更好的事情,所以我在想:(这可能有点难以实施(有效))
计算到目前为止每天收到的共享总数可能是一个好主意,以提高算法的效率。
按价格降序处理日期。
一天sell amount = min(daily sell limit, shares available)
(最高价格日(第一个处理日),可用股票=迄今收到的股票数。)
随后的所有日子shares available -= sell amount
。在前几天,我们二进制搜索(shares available - shares sold)
以及它与刚处理的日期之间的所有条目= 0。
我们可能不需要物理设置值(至少不是每一步都是这样),只需从历史记录中即时计算它们(我正在考虑间隔树或类似的东西)。