动态规划复习day05

今天继续说股票问题三

题目: 买卖股票的最佳时机Ⅲ

解题思路

同理,我们还是按照老样子走。

  1. 先判断状态和选择

    • 状态:今天第i天,我手里是否有股票,以及我卖出过几次股票。
    • 选择:我要么卖,要么买。
  2. 再定义dp数组
    • dp数组的定义根据上面的来看,状态有3个值,我们可以使用三维dp数组来实现,dp [i] [j] [k]表示这三个状态值。j表示是否持有股票,也就是只有两种状态,j可取0或者1。k的状态表示卖出过几次股票,因为我们只允许卖2次,因此k可取0,1,2三个值。这样也就确定了dp数组的含义:第i天持股状态为j,卖出股票数目为k时我能得到的最大利润。
  3. 最后确定dp状态转移方程
    • j = 0 ,手里没股票的情况

      • dp [i] [0] [0] 表示 k = 0 我也没卖出过股票,所以dp [i] [0] [0] = dp [i-1] [0] [0]
      • dp [i] [0] [1] 表示 k = 1我在今天之前卖出过1支股票,因此我的收入取决于我啥时候卖出的股票,即要么我昨天之前就已经卖出了这支股票,要么我今天卖的,取决于这二者中较大的一个。即
        • dp [i] [0] [1] = max(dp [i-1] [0] [1],dp [i-1] [1] [0] + prices[i])
      • dp [i] [0] [2] 表示 k = 2,我要么今天之前已经卖出了两股了,要么今天之前我卖了一股,今天我再卖一股
        • dp [i] [0] [2] = max(dp [i-1] [0] [1] + prices[i], dp [i-1] [0] [2])
    • j = 1 手里有股票的情况
      • 要么昨天我手里就有股票,要么我昨天手里没有,我今天买了一支。

        • dp [i] [1] [0] = max(dp [i-1] [1] [0],dp [i-1] [0] [0]-prices[i]);
      • 卖出过一次,然后又买了第二支,还没卖出去,那么我要么前一天就卖出过一次,但我手里没股票,然后今天又买了;要么,我前一天就卖出过一次,但我手里有,我今天啥也没干。
        • dp [i] [1] [1] = max(dp [i-1] [1] [1],dp [i-1] [0] [1]-prices[i]);
  4. 今天别忘了base case
    1. 第一天我手里就有股票,那么我不存在卖出股票数目k只能为0,dp [0] [1] [,0] = 0-prices[0]
    2. 第一天我手里没得股票,那么我第一天没买,dp [0] [0] [0] = 0;
  5. 我们的目标
    1. 求的是最后一天结束的时候我手里没股票的时候卖出过1次或者2次的最大利润。注意这个描述
    2. 即max(dp [len - 1] [0] [1] ,dp [len - 1] [0] [2])

到此我们分析完成,进行代码实现即可

代码实现

class Solution {public int maxProfit(int[] prices) {int len = prices.length;if (len <= 1) {return 0;}int[][][] dp = new int[len][2][3];// base casedp[0][1][0] = 0-prices[0];dp[0][1][1] = 0-prices[0];dp[0][1][2] = 0-prices[0];dp[0][0][0] = 0;// dp[0][0][1] = 0;// dp[0][0][2] = 0;// dp转移for (int i = 1; i < len ; i++) {dp[i][0][0] = 0;dp[i][0][1] = Math.max(dp[i - 1][0][1],dp[i - 1][1][0] + prices[i]);dp[i][0][2] = Math.max(dp[i - 1][0][2],dp[i - 1][1][1] + prices[i]);dp[i][1][0] = Math.max(dp[i - 1][1][0],dp[i - 1][0][0] - prices[i]);dp[i][1][1] = Math.max(dp[i - 1][1][1],dp[i - 1][0][1] - prices[i]);// dp[i][1][2] = 0;}return Math.max(dp[len - 1][0][1],dp[len - 1][0][2]);}
}

最后注意dp [0] [1] [1-2]这不存在的部分也要初始化出来的,而dp [0] [0] [k],k取1或者2的部分本来默认就是0,可以不写在basecase里,以及最后的dp [i] [1] [2]也是没意义的,可以不初始化。

20200714:动态规划复习day05相关推荐

  1. 20200713:动态规划复习day04

    动态规划复习day04 继续说股票问题 题目: 买卖股票的最佳时机Ⅱ 解题思路 首先说明这题在力扣标记为简单的原因,看下面的贪心解法: class Solution {public int maxPr ...

  2. 20200710:动态规划复习day03

    动态规划复习day03 今天来看股票问题1 题目一:买卖股票的最佳时机 解题思路 首先我们想到的不是动态规划的解法,是一个常规思路:找到后面与当前值的差值最大的那个值,即为我们需要找的卖出的day.因 ...

  3. 20200715:动态规划复习day06

    统计全1子矩阵 题目 思路与算法 代码实现 复杂度分析 题目 思路与算法 题意很好理解,但是本题的动态规划不是常规思路的,你需要很好的理解题意并仔细分析状态与转移关系,才能定义正确的dp数组以及其dp ...

  4. 20200708:动态规划复习day02

    写在前面 继续接着来写今天的动态规划系列 今天带来子序列相关的两道题,一起拓展动态规划的思路 题目一:最长上升子序列 解题思路 不再像昨天一样写我们如何找到状态选择的,直接来确定dp数组及其含义.没有 ...

  5. 动态规划复习-HDU1081

    注意多个测试用例,和poj不一样 注意输出用例结果之间要换行 代码如下: #include int rect[101][101]; int a[101], dp[101]; int n, mx; in ...

  6. 20200707:动态规划专题之不同路径

    动态规划复习day01 动态规划的题目一直是本人的弱项,这周尝试连续7天的动态规划专题,争取做到有的放矢. 不同路径Ⅰ和Ⅱ解析 题目一:不同路径 解题思路 依据动态规划解题的套路思路 确定状态和选择, ...

  7. NOIP复习篇———贪心

    NOIP复习篇---贪心 --------------------------------------------------------------------------------------- ...

  8. 算法设计与分析考前复习

    算法设计与分析考前复习 qiwang的NOJ系统在考前一天崩了,强烈建议开发新OJ 另外,由于以下这些题是我上完数电实验用了下午和晚上时间写的,可能会出一些错. 分治法复习 二分查找 描述 给定一个单 ...

  9. 中级软件设计师知识总结

    文章目录 复习进度 分型 一.面向对象 1 面向对象的概念 面向对象设计原则 2 UML 静态图/结构图包括: 动态图/行为图包括: 3 4 设计模式 设计模式概念 设计模式的分类 创建型模式 结构型 ...

最新文章

  1. 横向瀑布流android,RecyclerView实现瀑布流布局
  2. elecV2P实现任务定时通知
  3. vue教程2-03 vue计算属性的使用 computed
  4. 设计模式系列1:单例模式(Singleton Pattern)
  5. Android之判断时间戳是不是今天
  6. NOIP模拟测试22「位运算」
  7. 识别图片baidu ai php,PHP+百度AI OCR文字识别实现了图片的文字识别功能
  8. pta-4、运算符-找钱 (10 分)
  9. 关于小范围整数N拆解成2的幂相加的个数
  10. linux下普通用户账号管理
  11. envi 面向对象遥感图像分类
  12. Android7.0的xposed框架,Android 7.x 安装Xposed框架
  13. 服务器上怎么安虚拟主机呀,上线虚拟主机产品步骤
  14. Halcon深度学习环境搭建(win下)全网最全教程
  15. 关机、睡眠和休眠有啥区别
  16. java8 collections_初识Java8新特性Lambda(二) 之collections
  17. 【开发】后端框架——SpringBoot
  18. excel表格经纬度同表格分成经度纬度两个表格
  19. html 的打印和下载
  20. 基于STM32的简单数字示波器

热门文章

  1. 拥有自我意识、自我模拟的粒子机器人来了
  2. 没有光刻机,就没有半导体
  3. 百度牵手“造王者”汉得,ToB 战场将迎大变局?| 畅言
  4. 手机芯片 AI 之争:高通、联发科均超华为!
  5. 11.73 亿人看央视春晚;苹果逼用户买充电器;特斯拉 Model 3 降价七千 | 极客头条...
  6. 流浪汉转型程序员,年薪超 70 万人民币!
  7. 福利 | 2018 年,程序员全新的技术之路
  8. 真的已经讲烂了!java字符串转对象
  9. centos7 安装 openssl和openssl升级
  10. mysql数据库命令_新手入门MYSQL数据库命令大全