博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 309. Best Time to Buy and Sell Stock with Cooldown
阅读量:7029 次
发布时间:2019-06-28

本文共 986 字,大约阅读时间需要 3 分钟。

题目意思大概是给出连续n天的股价,作出如下限制:

  1. 只能一次性买入卖出,不能分批交易。分多次买入再卖出或者买入一次然后分多次卖出都是不允许的。
  2. 卖出以后有一天的时间不能交易 (one day cooldown time)。

交易次数不限。求可以获得的最大利润。

 

根据题意,画出DFA如下

每天可以采取的动作有3种:

  1. 什么也不干
  2. 买入
  3. 卖出

初始状态为idle,手头没有任何股票,且可以进行买入交易。

如果当天或之前有买入动作,则状态为hold,持有股票。

如果当天有卖出动作,则状态变为sold。手头不再持有股票,但也不能买入。

至此,我们可以分别计算3种状态下,采取不同的行动以后各个状态的最大利润。

hold:

前一天为idle,当天买入,或者之前有买入动作,当天什么也不做:

hold = max(idle - prices[i], hold);

idle:

idle可以由之前的idle或sold状态变化而来:

idle = max(idle, sold);

sold:

当天卖出,由hold状态变化而来,注意,当天买入当天卖出是允许的。

sold = hold + prices[i];

 

最终代码如下:

class Solution {public:    int maxProfit(vector
& prices) { if(prices.empty() || prices.size() <= 1){ return 0; } int idle = 0, hold = -prices[0], sold = 0; for(int i = 1; i < prices.size(); i++){ hold = max(idle - prices[i], hold); idle = max(idle, sold); sold = hold + prices[i]; } return max(sold, idle); }};

 

转载于:https://www.cnblogs.com/k330/p/6502891.html

你可能感兴趣的文章
新旅程CSS 基础篇分享一
查看>>
查看内核函数调用的调试方法【原创】
查看>>
个人项目中遇到的问题
查看>>
byte与base64string的相互转化以及加密算法
查看>>
20145103 《Java程序设计》第3周学习总结
查看>>
ubuntu声音系统
查看>>
Java基础-关于session的详细解释
查看>>
洛谷P4364 IIIDX
查看>>
程序员恶搞图片===爆笑中......娱乐一下.....
查看>>
Debian 7.0.0 安装教程图解
查看>>
普通用户加sudo权限
查看>>
Linq 处理 List数据
查看>>
VISTA下的.NET2005 WEB应用程序
查看>>
WCF 第六章 序列化和编码 使用代理序列化类型
查看>>
暑假周总结四
查看>>
面向对象编程---图片轮播
查看>>
哈哈更新资源列表2
查看>>
[转]Beanstalkd简介(job生命周期)
查看>>
JQuery 限制文本输入只能输入数字(可自定义正则表达式)
查看>>
Vim使用Vundle安装代码补全插件(YouCompleteMe)
查看>>