学习方法与心得2——结合股票市场交易策略优化 | 豆包MarsCode AI刷题

122 阅读4分钟

问题描述

小R近期表现出色,公司决定以股票的形式给予奖励,并允许他在市场上进行交易以最大化收益。给定一个数组,数组中的第 i 个元素代表第 i 天的股票价格。小R需要设计一个算法来实现最大利润。

股票交易规则如下:

  • 小R可以多次买卖股票,但在买入新的股票前必须卖出之前的股票。
  • 每次卖出股票后存在一天的冷冻期,在冷冻期内小R不能购买股票。

你的任务是帮助小R计算出在遵守交易规则的情况下能够获得的最大利润。

  • stocks: 一个整数列表,表示连续几天内的股票价格。

代码实现

def solution(stocks):
    if not stocks or len(stocks) < 2:
        return 0

n = len(stocks)
# 定义三个状态
dp_buy = [-float('inf')] * n  # 第 i 天持有股票的最大收益
dp_sell = [0] * n             # 第 i 天卖出股票的最大收益
dp_cool = [0] * n             # 第 i 天处于冷冻期的最大收益

# 初始状态
dp_buy[0] = -stocks[0]

for i in range(1, n):
    # 第 i 天持有股票
    dp_buy[i] = max(dp_buy[i - 1], dp_cool[i - 1] - stocks[i])
    # 第 i 天卖出股票
    dp_sell[i] = dp_buy[i - 1] + stocks[i]
    # 第 i 天冷冻期
    dp_cool[i] = max(dp_cool[i - 1], dp_sell[i - 1])

# 返回最后一天最大利润
return max(dp_sell[-1], dp_cool[-1])

if __name__ == "__main__":
    # 测试用例
    print(solution([1, 2]) == 1)
    print(solution([2, 1]) == 0)
    print(solution([1, 2, 3, 0, 2]) == 3)
    print(solution([2, 3, 4, 5, 6, 7]) == 5)
    print(solution([1, 6, 2, 7, 13, 2, 8]) == 12)

一、题目解析

这是一道典型的动态规划问题,需要利用多状态转移来实现股票交易的最大化收益。核心问题在于如何合理地建模股票交易状态和转移规则。

1、规则总结

  • 可以多次买卖股票,但必须在卖出后才能再次买入。
  • 每次卖出后会有一天的冷冻期,冷冻期内不能买入股票。
  • 要在遵守规则的情况下,计算可以获得的最大收益。

2、动态规划思想

通过以下三个状态来建模:

  • dp_buy[i]:表示第 天结束时持有股票的最大收益。
  • dp_sell[i]:表示第 天结束时卖出股票的最大收益。
  • dp_cool[i]:表示第 天结束时处于冷冻期的最大收益。

3、状态转移方程:

  • 持有股票:第i天结束时,持有股票的收益可以是延续前一天的持有,或者在冷冻期后买入
  • 卖出股票:卖出股票的收益来源于前一天持有股票并卖出当前股票
  • 冷冻期:冷冻期的收益可以是延续前一天的冷冻期,或者今天刚刚卖出股票

4、边界条件

  • 第 0 天,持有股票的最大收益为 (买入成本)。
  • 卖出股票和冷冻期的最大收益为 0,因为没有交易。

5、最终结果

  • 最后一天的最大收益是卖出股票或者处于冷冻期的最大值

二、知识总结

  • 动态规划的灵活性:本题使用多个状态(dp_buy、dp_sell、dp_cool)进行建模,这是动态规划应用的一个重要方向。它要求我们从题意中明确每一步可能的状态变化。
  • 限制条件的建模:本题的冷冻期规则是一个复杂的限制,但通过明确不同状态的关系,我们可以轻松解决问题。
  • 边界条件的重要性:在动态规划中,初始状态决定了后续转移是否正确,因此需要格外注意边界条件的设定。

三、学习建议

  • 分类总结:将问题分为不同类型,比如动态规划、贪心算法等。明确每类问题的核心解决思路。
  • 逐步优化:先从暴力解法出发,再逐步优化。比如,本题可以先尝试暴力枚举每种交易情况,然后引入状态转移降低复杂度。
  • 重复练习:对于动态规划这类题型,重复练习是关键。尤其是状态定义和转移方程的构建。

四、小结

通过合理的学习计划和资源结合,我们可以快速提升算法能力,同时将复杂问题转化为可理解的逻辑。