股票问题汇总

思路

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]);
}

一次交易

买卖股票的最佳时机 I

交易次数无限

买卖股票的最佳时机 II

两次交易

买卖股票的最佳时机 III

k次交易

买卖股票的最佳时机 IV

含冻结期

含冷冻期

含手续费

最后更新于

这有帮助吗?