LeetCode 309 Best Time to Buy and Sell Stock with Cooldown 解决方案
题目描述
给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
- 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
- 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
示例:
输入: [1,2,3,0,2] 输出: 3 解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
解决方案1
可以通过一个状态转换图,来解决。
定义状态
s0 : 没有买股票时
s1 :买入股票且没有卖出股票时
s2:卖出股票是
那么状态转换可以这样表示
so->s1 买股票 s0->s0不操作
s1->s2 卖股票 s1->s1不操作
s2->s0 经过冷冻期 s2->s2 不操作
转换图也可以画出来:
那么每一次价格变动都会在这三个状态里
得出递推式
s0[i] = max(s0[i - 1], s2[i - 1]); 不操作 和 冷冻期过去
s1[i] = max(s1[i - 1], s0[i - 1] - prices[i]); 不操作 和 买股票
s2[i] = s1[i - 1] + prices[i]; 卖出股票
最终的状态应该会在s0和s2终态度有关, 因为s1是卖出股票 是 会比s0小的,
最优解表示为 max(s0[最后一次价格变动],s2[最后一次价格变动])
具体代码如下;
class Solution {
public:int maxProfit(vector<int>& prices){if (prices.size() <= 1) return 0;vector<int> s0(prices.size(), 0);vector<int> s1(prices.size(), 0);vector<int> s2(prices.size(), 0);//初始化 s1[0] = -prices[0];s0[0] = 0;s2[0] = INT_MIN;//状态转移for (int i = 1; i < prices.size(); i++) {s0[i] = max(s0[i - 1], s2[i - 1]);s1[i] = max(s1[i - 1], s0[i - 1] - prices[i]);s2[i] = s1[i - 1] + prices[i];}return max(s0[prices.size() - 1], s2[prices.size() - 1]);}
};
总结
这个动态规划问题竟然能用一种状态转换的方式来得到也是很神奇了, 动态规划关键是找到此时最优解和上一次的最优解之间的关系,而这个题目最优解是有2个状态产生的,而状态直接又有着紧密的关系,所以用状态转换图来理清关系,找到最优解的更新表示,最终得到结果。还是值得深思的。
转载于:https://www.cnblogs.com/qq874455953/p/9901052.html
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 解题报告
题目链接:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/ Say you have an ar ...
- 【Java力扣算法】LeetCode 309 Best Time to Buy and Sell Stock with Cooldown(动态规划)
题目: 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 . 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 你不能同时参与多笔交 ...
- 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 | 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 最佳买卖股票时机含冷冻期(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】309. Best Time to Buy and Sell Stock with Cooldown 解题报告(Python C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetc ...
最新文章
- 「AI初识境」深度学习中常用的损失函数有哪些?
- 拉格朗日乘子法 学习笔记
- Http接口设计(1)Token之前
- BJUI+SSM实现报表添加时间筛选功能
- BZOJ-2002-Bounce弹飞绵羊-分块
- iOS 获取wifi ssid 名称
- VSCode 插件开发实例(WebView):微信读书 ^-^边撸代码边看小说^-^
- Xcode 升级后,常常遇到的遇到的警告、错误,解决方法(转)
- Leedcode1-求树的最小高度
- app源码 php,PHP大型B2B2C商城源码带APP源码
- 案例:神经网络建模 + 可视化分析 = 提效增质的利器!
- 行政区域村级划分数据库_最新行政区划 省市区三级 街道乡镇四级 社区/村五级 每月更新(2020年12月版)...
- 微信公众号上传素材并回复关键词推送该素材:thinphp开发微信公众号如何上传临时素材库
- 曾国藩36字深入解读-借智慧
- 汉字一、二级字库的汉字与unicode编码(十六进制)对照表,按照unicode的顺序排列
- 行频、场频与分辨率、刷新率
- 数字宫殿方法记忆设计模式
- 公司裁员不想给补偿,竟然耍这些不要脸的裁员手段..
- 交易所步入「后FTX 时代」,WEEX唯客等后发新秀拉开补位战?
- Date,LocalDateTime类型,获取今年开始时间,获取去年的今天。
热门文章
- LINUX下载编译vorbis
- LINUX下载编译libspeex/libspeexdsp
- Shell脚本中使用awk进行空格分词
- 百度手机输入法,如何使用五笔98版?
- 解决安卓GridView的横向滚动问题
- linux下物理内存不足,vm中linux物理内存不足解决方案
- C#复制文件夹下的所有内容到另一个文件夹
- MySQL开发医药管理系统_医药管理系统struts+hibernat+mySql,内含需求分析,详细设计文档...
- VC++如何获取目标程序的句柄hProcess
- C++11与最小垃圾回收