LeetCode:123. 买卖股票的最佳时机 III

之前的含手续费定义了两个状态(持股与不持股), 含冷冻期定义了三个状态(持股, 不持股冷冻期, 不持股非冷冻期), 都是二维数组。

本题除了持股和不持股的两个状态之外, 还限制了最多只能进行两次交易。 这里需要增加一个状态来标记是第一次交易还是第二次交易。

难点: 初始化。

dp[0][2][1] = 负无穷:表示发生了 2 次交易,并且持股,这是不可能的。

注意:虽然没有意义,但是不能设置成 0,这是因为交易还没有发生,必须规定当天 k 状态为 1(持股),需要参考以往的状态转移,一种很有可能的情况是没有交易是最好的情况。

说明:dp[0][2][1] 设置成为负无穷这件事情我可能没有说清楚。大家可以通过特殊测试用例 [1, 2, 3, 4, 5],对比 dp[0][2][1] = 0dp[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 )相关推荐

  1. leetcode 123. 买卖股票的最佳时机 III(dp)

    给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的 ...

  2. 算法训练第五十天 | 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

    动态规划part11 123.买卖股票的最佳时机III 题目描述 思路 拓展 188.买卖股票的最佳时机IV 题目描述 思路 易错点 123.买卖股票的最佳时机III 题目链接:123.买卖股票的最佳 ...

  3. 【第50天| ● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV 】

    123.买卖股票的最佳时机III class Solution {public:int maxProfit(vector<int>& prices) {vector<int& ...

  4. 第43天| 123.买卖股票的最佳时机III、 188.买卖股票的最佳时机IV

    1.题目链接:123. 买卖股票的最佳时机 III 题目描述: 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易 ...

  5. 力扣 -- 123. 买卖股票的最佳时机 III

    题目链接:123. 买卖股票的最佳时机 III - 力扣(LeetCode) 下面是用动态规划的思想解决这道题的过程,相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴. 参考代码: class So ...

  6. LeetCode 123. 买卖股票的最佳时机 III(动态规划)

    1. 题目 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意: 你不能同时参与多笔交易(你必须在再次购买 ...

  7. 107. Leetcode 123. 买卖股票的最佳时机 III (动态规划-股票交易)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i] 表示的是在第i天可以获取的最大利润,每天会有持有股票和不持有股票两种状态,这个是 第二维度,还是用0和1表示. 而对于每一种状态,这里还会有交易 ...

  8. 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 套路之:暴力递 ...

  9. 力扣123. 买卖股票的最佳时机 III

    给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的 ...

最新文章

  1. 1071. 小赌怡情(15)
  2. 我为什么强烈反对程序员加班?
  3. everything文件搜索_Everything,闪电搜索,百万文件100%秒搜,真是文件搜索神器!...
  4. InChatter系统开源聊天模块前奏曲
  5. 安装Office SharePoint Server 2010实战
  6. 【参赛作品19】【openGauss】gsql客户端工具(二)gsql客户端工具之Data Studio客户端工具
  7. 嵌入式系统那些事—脚本语言tcl
  8. 什么是双线双IP和双线单IP
  9. Android 之 APP上架应用宝平台
  10. lua深拷贝一个table
  11. 科技云报道:“奇袭”混合云,青云QingCloud站上C位
  12. R报错|Package ‘MASS’ version 7.3.55 cannot be unloaded
  13. tf.cancat() 详解 —》理解为主
  14. java 开发用到网络爬虫,抓取汽车之家网站全部数据经历
  15. 痞子衡嵌入式:聊聊i.MXRT1170上串行NOR Flash双程序可交替启动设计
  16. 第一课c语言课前准备
  17. 为什么二分查找要取中点作为每次的划分点
  18. 共享书籍同类产品调研
  19. Windows下暗黑风格设置
  20. 考试系统软件是怎么保障考试公平公正的?

热门文章

  1. 基于python+pyqt+halcon实现视觉定位(halcon12.0)【附部分源码】
  2. 5天学Python(1)——语言基础
  3. 关于xxl-job-admin使用中指定账号密码时的坑
  4. hive 本地模式 远程模式操作
  5. python读取excel文件,把指定行表红
  6. 人工智能将改变教育的未来:让我们变得更聪明
  7. php伪协议读取目录,PHP文件包含,文件读取的利用思路,以及配合伪协议的trick...
  8. UglifyJS和Uglifycss使用
  9. 2016 Personal Training #4 Div.2 A B C G H
  10. ORACLE字符串截取函数trim(),ltrim(),rtrim()