股票优化 | 豆包Marscode AI刷题

45 阅读3分钟

题目回顾

image.png

测试样例

样例1:

输入:stocks = [1, 2]
输出:1

样例2:

输入:stocks = [2, 1]
输出:0

样例3:

输入:stocks = [1, 2, 3, 0, 2]
输出:3

样例4:

输入:stocks = [2, 3, 4, 5, 6, 7]
输出:5

样例5:

输入:stocks = [1, 6, 2, 7, 13, 2, 8]
输出:12

代码实现

def solution(stocks):
    if not stocks:
        return 0

    buy, sell, cooldown = -stocks[0], 0, 0
    for i in range(1, len(stocks)):
        new_buy = max(buy, cooldown - stocks[i])
        new_sell = max(sell, buy + stocks[i])
        new_cooldown = sell
        buy, sell, cooldown = new_buy, new_sell, new_cooldown

    return max(sell, cooldown)

if __name__ == "__main__":
    #  You can add more test cases here
    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 )

分析

在处理这类典型的动态规划问题时,我们明确地知晓需要通过合理地维护一些特定的状态来构建起完整的解题思路。其中,“buy” 和 “sell” 这两个状态的维护显得尤为重要。

首先来看 “buy” 状态,它所表征的是在持有股票这一情形下的最大利润状况。从逻辑层面去分析,当我们决定买入股票时,就开启了一个新的利润计算周期。此时,我们需要综合考虑多方面的因素来确定这个 “buy” 状态下的最大利润。一方面,买入价格是一个关键因素,它直接决定了我们的成本基础。如果买入价格过高,那么在后续股价波动过程中,要想实现较高的利润就会面临更大的挑战。另一方面,股价在买入之后的走势也是至关重要的。股价可能上涨,使得我们的资产增值,利润增加;也可能下跌,导致我们面临亏损的风险。通过对这些因素的动态分析和不断调整计算,我们才能准确把握在持有股票时的最大利润,也就是 “buy” 状态所蕴含的核心内容。

接着说 “sell” 状态,它对应的是不持有股票时的最大利润情形。当我们决定卖出股票时,意味着一个持有阶段的结束。在计算 “sell” 状态的最大利润时,我们要回溯之前的买入成本,结合当下的卖出价格以及可能存在的其他交易成本(如手续费等)进行综合考量。卖出价格高于买入成本且扣除其他成本后剩余部分才是真正的利润。而且,我们还需要考虑到不同的卖出时机对利润的影响。不同的股价走势下,选择不同的卖出时机,所获得的利润可能会有很大差异。通过对这些因素的细致权衡和精确计算,我们才能确定在不持有股票时的最大利润,即 “sell” 状态所代表的准确含义。

然而,由于问题中明确提到存在冷冻期这一特殊情况,这就使得我们的解题逻辑需要进一步拓展和完善。我们必须额外维护一个 “cooldown” 状态来表示冷冻期的最大利润。从逻辑推导的角度来看,在冷冻期内,虽然常规的股票买卖操作受到限制,但并不意味着利润情况就不存在变化。例如,可能存在一些与股票相关的被动收益情况,如股息分红等,或者在冷冻期之前的某些交易决策可能会对冷冻期内的利润产生影响。所以,为了全面且准确地反映整个股票交易过程中的利润情况,包括冷冻期这一特殊阶段,我们需要通过维护 “cooldown” 状态来纳入这些因素,从而使得我们能够基于这三个状态(buy、sell、cooldown)运用动态规划的方法完整地解决这一典型的动态规划问题。