📜  门|门 CS 1997 |问题 13(1)

📅  最后修改于: 2023-12-03 15:42:20.997000             🧑  作者: Mango

《门|门 CS 1997》题解——问答题13

题目描述

有一个长度为 $n$ 的序列 $a$,其中 $a_i$ 表示第 $i$ 天的股票价格。现在你有一个初始资金 $x$,你可以选择在任意一天买入一支股票,也可以选择在任意一天卖出手中的股票,也可以选择不进行任何操作。但是你最多只能持有一支股票,即手中最多只有一支股票,且在进行任何操作时手中必须有没有卖出的股票。请求出在经过若干次操作后,你最多能拥有的资金是多少。

解题思路

我们可以用一个 $dp$ 数组来记录每一天结束后,手上是否持有股票的情况下所获得的最大资金数量。设 $dp_i^0$ 表示第 $i$ 天结束时手中没有股票的情况下所获得的最大资金数量,$dp_i^1$ 表示第 $i$ 天结束时手中持有一只股票的情况下所获得的最大资金数量。

在第 $i$ 天结束时,手中没有股票则有两种情况:

  • 第 $i$ 天前就没有持股,这时此表现就是 $dp_{i}^0=dp_{i-1}^0$;
  • 第 $i$ 天卖出了手中的股票,这时此表现就是 $dp_i^0=dp_{i-1}^1+a_i$。

在第 $i$ 天结束时,手中持有一只股票则有两种情况:

  • 第 $i$ 天前就有持股,这时此表现就是 $dp_{i}^1=dp_{i-1}^1$;
  • 第 $i$ 天花钱购买了一只股票,这时此表现就是 $dp_i^1=dp_{i-1}^0-x_i$。

最终,最多能拥有的资金就是 $dp_n^0$。

代码实现
def max_profit(n: int, x: int, a: List[int]) -> int:
    dp_0, dp_1 = [0] * (n + 1), [-0x7fffffff] * (n + 1)
    for i in range(1, n + 1):
        dp_0[i] = max(dp_0[i - 1], dp_1[i - 1] + a[i - 1])
        dp_1[i] = max(dp_1[i - 1], dp_0[i - 1] - x - a[i - 1])
    return dp_0[n]