123. 买卖股票的最佳时机 III ( 三维dp )
LeetCode:123. 买卖股票的最佳时机 III
之前的含手续费定义了两个状态(持股与不持股), 含冷冻期定义了三个状态(持股, 不持股冷冻期, 不持股非冷冻期), 都是二维数组。
本题除了持股和不持股的两个状态之外, 还限制了最多只能进行两次交易。 这里需要增加一个状态来标记是第一次交易还是第二次交易。
难点: 初始化。
dp[0][2][1] = 负无穷
:表示发生了 2 次交易,并且持股,这是不可能的。
注意:虽然没有意义,但是不能设置成 0,这是因为交易还没有发生,必须规定当天 k 状态为 1(持股),需要参考以往的状态转移,一种很有可能的情况是没有交易是最好的情况。
说明:dp[0][2][1]
设置成为负无穷这件事情我可能没有说清楚。大家可以通过特殊测试用例 [1, 2, 3, 4, 5]
,对比 dp[0][2][1] = 0
与 dp[0][2][1] = 负无穷
的状态转移的差异去理解。
注意:只有在之前的状态有被赋值的时候,才可能有当前状态。
// 第二次持股// 由上一个持股状态转移下来, 又第一次不持股后买入股票dp[i][2][1] = Math.max(dp[i - 1][2][1], dp[i - 1][1][0] - prices[i]);dp[i - 1][1][0] - prices[i]// 当第一次交易完成后, 买入当前prices[i] 时,可能为负数// dp[0][2][1] 初始化为 0 时, 会将当前第二次入股改为 0,这个状态转移不是由第一次交易来的。 // 更不可能在第一天就直接发生两次交易并且持股, 然后从第一天的持股状态转移到第二天
具体思路已经写在代码注释中。
AC Code
class Solution {public int maxProfit(int[] prices) {// 找状态int len = prices.length;// len 天,两次交易, 持股或者不持股int[][][] dp = new int[len][3][2];// 0 不持股, 1 持股// 初始化// 第一次交易持股。dp[0][1][1] = -prices[0];// 第二次交易持股。 初始化为 0 不行dp[0][2][1] = Integer.MIN_VALUE;// 状态的顺序: 先持股, 再卖掉for(int i = 1; i < len; i++){// 持股 本来就有, 或者买入dp[i][1][1] = Math.max(dp[i - 1][1][1], -prices[i]); // 没有持股, 卖出 或者 上一个状态来dp[i][1][0] = Math.max(dp[i - 1][1][1] + prices[i], dp[i - 1][1][0]);// 第二次持股// 由上一个持股状态转移下来, 又第一次不持股后买入股票dp[i][2][1] = Math.max(dp[i - 1][2][1], dp[i - 1][1][0] - prices[i]);// 没有持股的状态 上一个持股状态卖掉了, 或者上一个没有持股状态转移下来dp[i][2][0] = Math.max(dp[i - 1][2][1] + prices[i], dp[i - 1][2][0]);}// 不持股状态的最大值 (第一次 / 第二次)return (int)Math.max(dp[len - 1][2][0], dp[len - 1][1][0]);}
}
参考: 动态规划(Java)
123. 买卖股票的最佳时机 III ( 三维dp )相关推荐
- leetcode 123. 买卖股票的最佳时机 III(dp)
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的 ...
- 算法训练第五十天 | 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV
动态规划part11 123.买卖股票的最佳时机III 题目描述 思路 拓展 188.买卖股票的最佳时机IV 题目描述 思路 易错点 123.买卖股票的最佳时机III 题目链接:123.买卖股票的最佳 ...
- 【第50天| ● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV 】
123.买卖股票的最佳时机III class Solution {public:int maxProfit(vector<int>& prices) {vector<int& ...
- 第43天| 123.买卖股票的最佳时机III、 188.买卖股票的最佳时机IV
1.题目链接:123. 买卖股票的最佳时机 III 题目描述: 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易 ...
- 力扣 -- 123. 买卖股票的最佳时机 III
题目链接:123. 买卖股票的最佳时机 III - 力扣(LeetCode) 下面是用动态规划的思想解决这道题的过程,相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴. 参考代码: class So ...
- LeetCode 123. 买卖股票的最佳时机 III(动态规划)
1. 题目 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意: 你不能同时参与多笔交易(你必须在再次购买 ...
- 107. Leetcode 123. 买卖股票的最佳时机 III (动态规划-股票交易)
步骤一.确定状态: 确定dp数组及下标含义 dp[i] 表示的是在第i天可以获取的最大利润,每天会有持有股票和不持有股票两种状态,这个是 第二维度,还是用0和1表示. 而对于每一种状态,这里还会有交易 ...
- leetcode 123. Best Time to Buy and Sell Stock III | 123. 买卖股票的最佳时机 III(总结DP 模型套路)
题目 https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/description/ DP 模型套路 DP 套路之:暴力递 ...
- 力扣123. 买卖股票的最佳时机 III
给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的 ...
最新文章
- 1071. 小赌怡情(15)
- 我为什么强烈反对程序员加班?
- everything文件搜索_Everything,闪电搜索,百万文件100%秒搜,真是文件搜索神器!...
- InChatter系统开源聊天模块前奏曲
- 安装Office SharePoint Server 2010实战
- 【参赛作品19】【openGauss】gsql客户端工具(二)gsql客户端工具之Data Studio客户端工具
- 嵌入式系统那些事—脚本语言tcl
- 什么是双线双IP和双线单IP
- Android 之 APP上架应用宝平台
- lua深拷贝一个table
- 科技云报道:“奇袭”混合云,青云QingCloud站上C位
- R报错|Package ‘MASS’ version 7.3.55 cannot be unloaded
- tf.cancat() 详解 —》理解为主
- java 开发用到网络爬虫,抓取汽车之家网站全部数据经历
- 痞子衡嵌入式:聊聊i.MXRT1170上串行NOR Flash双程序可交替启动设计
- 第一课c语言课前准备
- 为什么二分查找要取中点作为每次的划分点
- 共享书籍同类产品调研
- Windows下暗黑风格设置
- 考试系统软件是怎么保障考试公平公正的?
热门文章
- 基于python+pyqt+halcon实现视觉定位(halcon12.0)【附部分源码】
- 5天学Python(1)——语言基础
- 关于xxl-job-admin使用中指定账号密码时的坑
- hive 本地模式 远程模式操作
- python读取excel文件,把指定行表红
- 人工智能将改变教育的未来:让我们变得更聪明
- php伪协议读取目录,PHP文件包含,文件读取的利用思路,以及配合伪协议的trick...
- UglifyJS和Uglifycss使用
- 2016 Personal Training #4 Div.2 A B C G H
- ORACLE字符串截取函数trim(),ltrim(),rtrim()