股票问题
November 22, 2024About 2 min
股票问题
那么对于这道题,我们具体到每一天,看看总共有几种可能的「状态」,再找出每个「状态」对应的「选择」。我们要穷举所有「状态」,穷举的目的是根据对应的「选择」更新状态。听起来抽象,你只要记住「状态」和「选择」两个词就行,下面实操一下就很容易明白了。
选择
每天都有三种「选择」:买入、卖出、无操作,我们用 buy
, sell
, rest
表示这三种选择。
限制
sell
必须在 buy
之后,buy
必须在 sell
之后。那么 rest
操作还应该分两种状态,一种是 buy
之后的 rest
(持有了股票),一种是 sell
之后的 rest
(没有持有股票)。
还有交易次数 k
的限制,就是说你 buy
还只能在 k > 0
的前提下操作。
状态
这个问题的「状态」有三个,
- 第一个是天数,
- 第二个是允许交易的最大次数,
- 第三个是当前的持有状态(即之前说的
rest
的状态,我们不妨用 1 表示持有,0 表示没有持有)。
然后我们用一个三维数组就可以装下这几种状态的全部组合:
dp[i][k][0 or 1]
0 <= i <= n - 1, 1 <= k <= K
n 为天数,大 K 为交易数的上限,0 和 1 代表是否持有股票。
此问题共 n × K × 2 种状态,全部穷举就能搞定。
答案
我们想求的最终答案是 dp[n - 1][K][0]
,即最后一天,最多允许 K
次交易,最多获得多少利润。
状态转移
base case:
dp[-1][...][0] = dp[...][0][0] = 0
dp[-1][...][1] = dp[...][0][1] = -infinity
状态转移方程:
dp[i][k][0] = max(dp[i-1][k][0], dp[i-1][k][1] + prices[i])
dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0] - prices[i])