【Java力扣算法】LeetCode 309 Best Time to Buy and Sell Stock with Cooldown(动态规划)
题目:
给定一个整数数组,其中第 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(动态规划)相关推荐
- 【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 ...
- [刷题]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 ...
- 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 ...
- [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 ...
- 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 ...
- 【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: ...
- 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- ...
- LeetCode 309. Best Time to Buy and Sell Stock with Cooldown--Java解法-卖股票系列题目
此文首发于我的Jekyll博客:zhang0peter的个人博客 LeetCode题解文章分类:LeetCode题解文章集合 LeetCode 所有题目总结:LeetCode 所有题目总结 题目地址: ...
- LeetCode 123. Best Time to Buy and Sell Stock III--Python解法--动态规划--数学题
此文首发于我的个人博客:zhang0peter的个人博客 LeetCode题解文章分类:LeetCode题解文章集合 LeetCode 所有题目总结:LeetCode 所有题目总结 题目地址:Best ...
最新文章
- C 语言编程 — 变量和常量
- 一个时代的结束:微软盖茨的人生掠影(组图)
- Codeforces Round #599 (Div. 2) E. Sum Balance 图转换 + 子集dp + 环
- 洛谷P1346-电车【日常图论,最短路,SPFA】
- IOS8模拟器设置中文输入
- java jdk运行_java运行机制、Jdk版本及Java环境变量
- 同一页面中加载两个相同的控件,结果只能出来一个,这是为什么
- 计算机基础构建,构建高职《计算机网页设计》课程教学过程设计模式_计算机基础大一考试题...
- 服务器机房维护制度,服务器机房的管理制度.doc
- 实战ASP.NET访问共享文件夹
- excel 多行 取消隐藏_如何在Excel 2013中隐藏和取消隐藏行和列
- 免费下载的音乐的6个网站,非常实用!
- java maven项目导入本地jar包
- HDU6608 Fansblog
- java求素数的方式
- python绘制剖面图_Python气象绘图教程—(十九)剖面图
- 编译原理(哈工大)绪论
- win7计算机剩余空间,WIN7 C盘空间越来越小解决方法
- 「镁客早报」世界产权组织称:2018年国际专利申请华为排名第一;微软股价大涨,市值超9000亿美元...
- python3.7安装并导入cartopy和geoplot