股票交易两次最大利润

动态规划 三维数组
在递归实现时,我们用了三个变量:index、status、k。这里我们定义一个三维数组
dp[n][3][2] 这里的n表示天数

dp[i][0][0]:表示第i天交易了0次时卖出后的累计最大利润
dp[i][0][1]:表示第i天交易了0次时买入后的累计最大利润
dp[i][1][0]:表示第i天交易了1次时卖出后的累计最大利润
dp[i][1][1]:表示第i天交易了1次时买入后的累计最大利润
dp[i][2][0]:表示第i天交易了2次时卖出后的累计最大利润
dp[i][2][1]:表示第i天交易了2次时买入后的累计最大利润
注意,最后一个dp[i][2][1] 实际是不存在的,因为交易两次后,就不能再买入了。

我们来分析一下上面定义的dp数组:

dp[i][0][0]:对应于初始状态,第i天0次交易卖出,既然都没交易,那何来卖出呢,所以只能是0。
dp[i][0][1]和dp[i][1][0] 这两个是一对,对应到上图中就是第一次买入、第一次卖出。
dp[i][1][1]和dp[i][2][0] 这两个也是一对,对应到上图中就是第二次买入、第二次卖出。
从这里我们也能看出为什么dp[i][2][1]是无效的。

再看一下状态转换公式如何推导的
前面我们分析过了,买入1这个状态只能从两个地方转换来,买入1本身(保持不动),或者是初始状态转换而来。
而卖出1这个状态,也只能从两个地方转换而来,卖出1本身(保持不动),或者从买入1转来。

那么根据上面描述,我们可以算出第一次买卖的DP公式:

第一次买入:从初始状态转换而来,或者第一次买入后保持不动
dp[i][0][1] = max(dp[i-1][0][1],dp[i-1][0][0]-prices[i])

第一次卖出:从第一次买入转换而来,或者第一次卖出后保持不动
dp[i][1][0] = max(dp[i-1][1][0],dp[i-1][0][1]+prices[i])
再来分下一下第二次的买卖过程:
同样,第二次买入只能从 第一次买入转换来,或者保持不动
第二次卖出只能从第二次买入转换来,或者保持不动

那么根据上面描述,我们可以算出第二次买卖的DP公式:

第二次买入:从第一次卖出转换而来,或者第二次买入后保持不动
dp[i][1][1] = max(dp[i-1][1][1],dp[i-1][1][0]-prices[i])

第二次卖出:从第二次买入转换而来,或者第二次卖出后保持不动
dp[i][2][0] = max(dp[i-1][2][0],dp[i-1][1][1]+prices[i])
我们把第一次买卖、第二次买卖的DP公式合到一起,就拿到了完整的推导过程。
之后我们还需要处理一下 第一天的初始化状态(具体请看代码部分)
最后求的利润最大值就保存在 dp[n-1][0][0]、dp[n-1][0][1]、dp[n-1][1][0]、dp[n-1][1][1]、dp[n-1][2][0]中,我们求出这几个值的max再返回就可以了。

代码实现:

javapython

class Solution {
public int maxProfit(int[] prices) {
if(prices==null || prices.length==0) {
return 0;
}
int n = prices.length;
//定义三维数组,第i天、交易了多少次、当前的买卖状态
int[][][] dp = new int[n][3][2];
//初始化第一天,这里的dp[0][2][1]可以不用管,后面也不会用到
dp[0][0][0] = 0;
dp[0][0][1] = -prices[0];//表示买了一次
dp[0][1][0] = 0;//表示当日买了又买了
dp[0][1][1] = -prices[0];//表示买了又卖了又买了
dp[0][2][0] = 0;//表示买了两次买了两次
dp[0][2][1] = -prices[0];//表示买了三次卖了两次
for(int i=1;i<n;++i) {
//dp[i][0][0]相当于初始状态,它只能从初始状态转换来
dp[i][0][0] = dp[i-1][0][0];
//处理第一次买入、第一次卖出
dp[i][0][1] = Math.max(dp[i-1][0][1],dp[i-1][0][0]-prices[i]);
dp[i][1][0] = Math.max(dp[i-1][1][0],dp[i-1][0][1]+prices[i]);
//处理第二次买入、第二次卖出
dp[i][1][1] = Math.max(dp[i-1][1][1],dp[i-1][1][0]-prices[i]);
dp[i][2][0] = Math.max(dp[i-1][2][0],dp[i-1][1][1]+prices[i]);
}
//返回最大值
int a = Math.max(dp[n-1][0][0],dp[n-1][0][1]);
int b = Math.max(dp[n-1][1][0],dp[n-1][1][1]);
return Math.max(Math.max(a,b),dp[n-1][2][0]);
}
}

作者:wang_ni_ma
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii/solution/wu-chong-shi-xian-xiang-xi-tu-jie-123mai-mai-gu-pi/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii/solution/wu-chong-shi-xian-xiang-xi-tu-jie-123mai-mai-gu-pi/](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii/solution/wu-chong-shi-xian-xiang-xi-tu-jie-123mai-mai-gu-pi

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268