股票问题汇总
思路
dp[i][k][1] 的含义就是:今天是第i天,我现在手上持有着股票,至今最多进行 k 次交易。
dp[i][k][0] 的含义就是:今天是第i天,我现在手上没有着股票,至今最多进行 k 次交易。
状态转移方程:
dp[i][k][0] = max(dp[i-1][k][0], dp[i-1][k][1] + prices[i])
max( 选择 rest , 选择 sell )
解释:今天我没有持有股票,有两种可能:
要么是我昨天就没有持有,然后今天选择 rest,所以我今天还是没有持有;
要么是我昨天持有股票,但是今天我 sell 了,所以我今天没有持有股票了。
dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0] - prices[i])
max( 选择 rest , 选择 buy )
解释:今天我持有着股票,有两种可能:
要么我昨天就持有着股票,然后今天选择 rest,所以我今天还持有着股票;
要么我昨天本没有持有,但今天我选择 buy,所以今天我就持有股票了。
for 0 <= i < n:
for 1 <= k <= K:
for s in {0, 1}:
dp[i][k][s] = max(buy, sell, rest)
base case:
dp[-1][k][0] = dp[i][0][0] = 0
dp[-1][k][1] = dp[i][0][1] = -infinity
核心代码:
for (let i = 1; i < n; i++){
//卖出时利润:求最大值(上次交易卖出时利润,本次交易卖出时利润)
profit_out = Math.max(profit_out, profit_in + prices[i]);
//买入时利润:求最大值(上次买入时利润,本次买入时利润)
profit_in = Math.max(profit_in, - prices[i]);
}一次交易
交易次数无限
两次交易
k次交易
含冻结期
含手续费
最后更新于
这有帮助吗?