题目:

给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。​

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

  • 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
  • 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

示例:

输入: [1,2,3,0,2]
输出: 3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

思路:

动态规划就是通过状态转移公式,也就是   当前状态和 下一状态的对比,比出哪个更好就取用哪个。

对于这个题来说就是  sell的时候,其实就是比较  昨天卖比较好还是今天卖比较好,所以就是sell[i] = max(sell[i] , sell[i-1]),因为sell[i] =sell[i]就没意义了,所以这时候就要找一个sell[i]的替代品,所以推理一下第i天卖sell[i]就=当前价格price[i] - 从前一天算起的最合理买入价格buy[i-1]。由此可以推出一个状态转移方程     sell(i) = max(sell(i - 1) ,price(i) - buy(i - 1))。

同理  买入的时候就是比较今天买比较好还是昨天买比较好。buy[i] = max(buy[i] , buy[i - 1])--->max(buy[i - 1] , sell(i - 2) - price(i))。其中替换buy(i) 的sell(i - 2) - price(i) 的意思就是上一次卖出后 又买入挣得钱。为什么是sell(i -2)原因就是有一天的冻结期,如果没有冻结期的话就是sell(i - 1)了。

这时候再把 冻结期加上,因为冻结期就是因为前一天卖了,所以第二天才会冻结,所以cooldown(i) = sell(i - 1)。

所以先定义dp二维数组,因为有三个变量,所以用第二维用来区分(dp[i][0] 表示卖的时候可以挣的最多的钱,dp[i][1]表示买的时候可以挣的最多的钱,dp[i][2]表示冻结时期时候  能挣的最多的钱)

通过一个例子来逐步解释解释:

价格  1  2  3  0  1  0  6
冻结  0  0  1  2  2  2  2
卖出  0  1  2  2  2  2  8  比较前一天卖整的多还是当天买挣的多sell(i-1),sell(i)--> sell(i-1) buy(i-1)+price(i)
买入 -1 -1 -1  1  1  2  2  比较前一天买挣得多还是当天买挣得多buy(i-1),buy(i)  --> buy(i-1) sell(i-2)-price(i) 

代码:

    public static int maxProfit(int[] prices) {int[][] dp=new int[prices.length][3];//添加边界判断条件if(prices == null || prices.length < 2)  return 0;//定义三个数组,买的 卖的 冻结的时刻可以挣的最多的钱。dp[0][0]=0;//selldp[0][1]= - prices[0];//buydp[0][2]=0;//cooldownfor(int i = 1 ;i < prices.length ;i++){dp[i][0]=Math.max(dp[i - 1][0],dp[i - 1][1] + prices[i]);dp[i][1]=Math.max(dp[i - 1][1],dp[i - 1][2] - prices[i]);dp[i][2]=dp[i - 1][0];}return Math.max(dp[prices.length - 1][0],dp[prices.length - 1][2]);}

结果:

【Java力扣算法】LeetCode 309 Best Time to Buy and Sell Stock with Cooldown(动态规划)相关推荐

  1. 【DP + 卖股票】LeetCode 309. Best Time to Buy and Sell Stock with Cooldown

    LeetCode 309. Best Time to Buy and Sell Stock with Cooldown Solution1: 比较有难度的一道动态规划题了! 参考网址:http://z ...

  2. [刷题]leetcode #309 - Best Time to Buy and Sell Stock with Cooldown

    题目 代码 class Solution {public int maxProfit(int[] prices) {if (prices.length <= 1) return 0;int l ...

  3. leetcode 309. Best Time to Buy and Sell Stock with Cooldown | 309. 最佳买卖股票时机含冷冻期(动态规划)

    题目 https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/ 题解 我知道要dp,但是不知道要怎么dp ...

  4. [leetcode] 309. Best Time to Buy and Sell Stock with Cooldown 解题报告

    题目链接:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/ Say you have an ar ...

  5. Leetcode 309. Best Time to Buy and Sell Stock with Cooldown

    这道题用的是dp的思想,用buy, sell, cooldown记录当前这些状态下最多的profit. 对于day i 而言: sell[i] = buy[i-1] + prices[i] buy[i ...

  6. 【LeetCode】309. Best Time to Buy and Sell Stock with Cooldown 最佳买卖股票时机含冷冻期(Medium)(JAVA)

    [LeetCode]309. Best Time to Buy and Sell Stock with Cooldown 最佳买卖股票时机含冷冻期(Medium)(JAVA) 题目地址: https: ...

  7. 309. Best Time to Buy and Sell Stock with Cooldown**

    309. Best Time to Buy and Sell Stock with Cooldown** https://leetcode.com/problems/best-time-to-buy- ...

  8. LeetCode 309. Best Time to Buy and Sell Stock with Cooldown--Java解法-卖股票系列题目

    此文首发于我的Jekyll博客:zhang0peter的个人博客 LeetCode题解文章分类:LeetCode题解文章集合 LeetCode 所有题目总结:LeetCode 所有题目总结 题目地址: ...

  9. LeetCode 123. Best Time to Buy and Sell Stock III--Python解法--动态规划--数学题

    此文首发于我的个人博客:zhang0peter的个人博客 LeetCode题解文章分类:LeetCode题解文章集合 LeetCode 所有题目总结:LeetCode 所有题目总结 题目地址:Best ...

最新文章

  1. C 语言编程 — 变量和常量
  2. 一个时代的结束:微软盖茨的人生掠影(组图)
  3. Codeforces Round #599 (Div. 2) E. Sum Balance 图转换 + 子集dp + 环
  4. 洛谷P1346-电车【日常图论,最短路,SPFA】
  5. IOS8模拟器设置中文输入
  6. java jdk运行_java运行机制、Jdk版本及Java环境变量
  7. 同一页面中加载两个相同的控件,结果只能出来一个,这是为什么
  8. 计算机基础构建,构建高职《计算机网页设计》课程教学过程设计模式_计算机基础大一考试题...
  9. 服务器机房维护制度,服务器机房的管理制度.doc
  10. 实战ASP.NET访问共享文件夹
  11. excel 多行 取消隐藏_如何在Excel 2013中隐藏和取消隐藏行和列
  12. 免费下载的音乐的6个网站,非常实用!
  13. java maven项目导入本地jar包
  14. HDU6608 Fansblog
  15. java求素数的方式
  16. python绘制剖面图_Python气象绘图教程—(十九)剖面图
  17. 编译原理(哈工大)绪论
  18. win7计算机剩余空间,WIN7 C盘空间越来越小解决方法
  19. 「镁客早报」世界产权组织称:2018年国际专利申请华为排名第一;微软股价大涨,市值超9000亿美元...
  20. python3.7安装并导入cartopy和geoplot

热门文章

  1. ajax读取json文件 / 跨域问题
  2. ORA-16401: archivelog rejected by RFS
  3. 重磅:保障汽车软件安全更新 美国研发新开源框架
  4. 【拓扑学知识】4.拓扑性质--分离公理与可数公理(分离性和可数性)
  5. 图像分割之基于阙值的分割方法
  6. 曾做erp开发工程师,谈下自己的经验
  7. XUPT 寒假算法集训第一周
  8. (一)Yocto的介绍
  9. 如何正确创建电子邮件通讯(逐步)
  10. 对向传播神经网络(CPN)