#刷题交流# 第20天:股票市场交易策略优化
为了帮助小R计算出在遵守交易规则的情况下能够获得的最大利润,我们可以使用动态规划(Dynamic Programming, DP)的方法来解决问题。我们定义三个状态:
● hold:表示持有股票时的最大收益。
● sell:表示卖出股票后的最大收益。
● rest:表示处于冷冻期或选择休息(不买卖)时的最大收益。
这三个状态之间的转移方程如下:
● hold[i] = max(hold[i - 1], rest[i - 1] - price[i]):要么保持之前的持有状态,要么从冷冻期后购买新股票。
● sell[i] = hold[i - 1] + price[i]:只能从前一天的持有状态转变而来,表示今天卖出股票。
● rest[i] = max(rest[i - 1], sell[i - 1]):要么从前一天的冷冻期或卖出状态转变而来,表示今天不进行任何操作。
初始条件为:
● hold[0] = -price[0]:第一天买入股票后的收益。
● sell[0] = 0:第一天没有可以卖出的股票。
● rest[0] = 0:第一天没有之前的操作,所以休息的收益为0。
最后的结果是最后一天的 sell 和 rest 状态中的较大值,因为如果最后一天持有股票则不是最优解(除非最后一日的股价为负,但这是题目所不允许的情况)。
核心代码:
# 初始化状态
hold, sell, rest = -stocks[0], 0, 0
for i in range(1, len(stocks)):
# 必须先保存旧的 hold 值,因为它会被新的 hold 值覆盖,而 sell 需要使用旧的 hold 值
old_hold = hold
hold = max(hold, rest - stocks[i])
rest = max(rest, sell)
sell = old_hold + stocks[i]
# 返回最后一天 sell 或 rest 状态中的较大值
return max(sell, rest)
20天了,加油⛽️ 不积跬步,无以至千里;不积小流,无以成江海。