股票问题是动态规划中一类很恶心的题目,大家可以自己先去做一下,你一定会发现各个股票的问题解法都不一样,奇淫技巧特别多,让人觉得,我怎么想得到?再让我做一遍我也做不出来!
那么今天,我将告诉大家一个通用的方法,一个方法,解决6道股票问题。同时也要感谢leetcode用户fun4LeetCode,本文参考:https://urlify.cn/zYbu2a
首先,我们用一个三维数组来存储状态的组合:
dp[i][k][f]
i为第i天,k为交易次数,f为手中是否有股票(0\1)
dp[3][2][1] 的含义:
今天是第三天,我现在手上持有着股票,已经交易了2次
dp[2][3][0] 的含义:
今天是第二天,我现在手上没有持有股票,已经交易了3次
我们想求的最终答案是dp[n-1][K][0],
即最后一天,K次交易之后,最多获得多少利润。
0代表股票已经卖出去了。
那么我们可以很容易的写出状态转移方程:
dp[i][k][0] = max(dp[i-1][k][0], dp[i-1][k][1] + prices[i])
解释:第i天我没有持有股票,有两种可能:
要么是我昨天就没有持有,然后今天选择“闲着”,
所以我今天还是没有持有;
要么是我昨天持有股票,但是今天我“卖了”,
所以我今天没有持有股票了。
dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0] - prices[i])
解释:第i天我持有着股票,有两种可能:
要么我昨天就持有着股票,然后今天选择“闲着”,
所以我今天还持有着股票;
要么我昨天本没有持有,但今天我选择“买入”,
所以今天我就持有股票了。
好了。基本框架解释完毕,我们来看题:
121. 买卖股票的最佳时机
这道题直接套状态转移方程:
dp[i][1][0] = max(dp[i-1][1][0], dp[i-1][1][1] + prices[i])
dp[i][1][1] = max(dp[i-1][1][1], dp[i-1