原题链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/

一开始用普通的动态规划做,思路是:

dp[i]=dp[j]+j到i之间数的最大差

一般动态规划用这种方法也可行,但是这里的边界判断真的把我想吐了。当i<=3的时候,这些数是可以直接计算的,因为不符合间隔的条件。或者当j=0的时候,也是可以直接计算,其余的情况需要间隔一个。

 int maxProfit(vector<int>& prices) {if(prices.empty()) return 0;int len=prices.size();if(len==1) return 0;vector<int> dp(len,0);vector<vector<int>> sub(len,vector<int>(len,0));for(int i=0;i<len;i++){for(int j=0;j<i;j++){sub[i][j]=std::max(sub[i][j],prices[i]-prices[j]);}}for(int i=1;i<len;i++){for(int j=0;j<i;j++){if(j==0||i<3){dp[i]=max(dp[i],dp[j]+sub[i][j]);}else{if(j+2>i) break;dp[i]=max(dp[i],dp[j]+sub[i][j+2]);}}}return dp[len-1];}

但是这种方法会超时,看了题解之后有更好的动态规划方法。

dp[i][j]代表第i天,j取值为0或者1,0代表不持有股票,1代表持有股票

于是有

dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i])//要么是前一天的状态,要么是前一天持有今天卖出
dp[i][1]=max(dp[i-1][1],dp[i-2][0]-prices[i])//要么是前一天的状态,要么是两天前卖出,今天买入

这里有个问题就是dp[i-2][0]其实不一定代表是第i-2天一定卖出,也可能是不持有状态的延续,所以是不是有问题呢?

这里leetcode上一个用户的解释比较好理解:

没有“冷冻期”的DPtable如下式:

dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i])
dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i])

添加“冷冻期”条件后,dp[i-1][0] - prices[i]代表的“i-1天买入”不一定能成立,要再判断“i-2天是否存在卖出行为”

所以进一步拆解dp[i-1][0]

dp[i-1][0] = max(dp[i-2][0], dp[i-2][1] + prices[i])
dp[i][1] = max(dp[i-1][1], max(dp[i-2][0], dp[i-2][1] + prices[i]) - prices[i])

其中dp[i-2][1] + prices[i]代表着“i-2发生了卖出行为”,有违题意,应予删除,得下式:

dp[i][1] = max(dp[i-1][1], max(dp[i-2][0]) - prices[i])

代码:

int maxProfit(vector<int>& prices) {int n=prices.size();if(n==0||n==1) return 0;vector<vector<int>> dp(n,vector<int>(2,0));dp[0][0]=0;dp[0][1]=-prices[0];dp[1][0]=max(0,prices[1]-prices[0]);dp[1][1]=max(-prices[0],-prices[1]);  for(int i=2;i<n;i++){dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i]);dp[i][1]=max(dp[i-1][1],dp[i-2][0]-prices[i]);}return dp[n-1][0];
}

简化:

int maxProfit(vector<int>& prices) {int len=prices.size();int dp_i_0=0,dp_i_1=INT_MIN,dp_pre_0=0;int tmp;for(int i=0;i<len;i++){tmp=dp_i_0;dp_i_0=max(dp_i_0,dp_i_1+prices[i]);dp_i_1=max(dp_i_1,dp_pre_0-prices[i]);dp_pre_0=tmp;}return dp_i_0;
}

使用dp_i_0,dp_i_1,dp_pre_0这些是为了循环从0开始并且方便存储dp[i-2][0]

参考链接:
https://github.com/labuladong/fucking-algorithm/blob/master/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%B3%BB%E5%88%97/%E5%9B%A2%E7%81%AD%E8%82%A1%E7%A5%A8%E9%97%AE%E9%A2%98.md

leetcode算法题--最佳买卖股票时机含冷冻期★相关推荐

  1. LeetCode:309. 最佳买卖股票时机含冷冻期(python)

    LeetCode:309. 最佳买卖股票时机含冷冻期(python) 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 . 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能 ...

  2. leetcode系列-309.最佳买卖股票时机含冷冻期

    题目描述:给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 .​设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):卖 ...

  3. 【必备算法】动态规划:LeetCode题(九)309. 最佳买卖股票时机含冷冻期,714. 买卖股票的最佳含手续费

    买卖股票系列: [必备算法]动态规划:一个思路解决六道股票问题 [必备算法]动态规划:LeetCode题(七)121. 买卖股票的最佳时机,122. 买卖股票的最佳时机 II [必备算法]动态规划:L ...

  4. 【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: ...

  5. LeetCode 309. 最佳买卖股票时机含冷冻期 | Python

    文章目录 309. 最佳买卖股票时机含冷冻期 题目 解题思路 代码实现 实现结果 欢迎关注 309. 最佳买卖股票时机含冷冻期 题目来源:力扣(LeetCode)https://leetcode-cn ...

  6. leetcode 最佳买卖股票时机含冷冻期(Java)

    leetcode题目 最佳买卖股票时机含冷冻期 -- leetcode 309 题目描述 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 .​设计一个算法计算出最大利润.在满足以下约束 ...

  7. leetcode 309:最佳买卖股票时机含解冻期

    leetcode 309:最佳买卖股票时机含解冻期 给定一个整数数组 prices,其中第 prices[i] 表示第 *i* 天的股票价格 . 设计一个算法计算出最大利润.在满足以下约束条件下,你可 ...

  8. 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 ...

  9. Java实现 LeetCode 309 最佳买卖股票时机含冷冻期

    309. 最佳买卖股票时机含冷冻期 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 .​ 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股 ...

最新文章

  1. AutoCAD 2D与3D大师班学习教程 AutoCAD 2D and 3D Masterclass
  2. spring 源码 找不到 taskprovider_一步一步构建Spring5源码
  3. PHP版本VC6与VC9/VC11/VC14、Thread Safe与None-Thread Safe等的区别
  4. Android中使用Intent的Action和Data属性实现点击按钮跳转到拨打电话和发送短信
  5. IO多路转接之poll
  6. insert ... on duplicate key update产生death lock死锁原理
  7. oracle调整Lock_sga参数而不使用虚拟内存
  8. lamda获取参数集合去空_集合源码解析之LinkedList
  9. 面试题 04.08. 首个共同祖先
  10. STM32库函数模板创建
  11. Linux下oracle数据库备份方案
  12. Android双目摄像头(带人脸检测)正确调用姿势
  13. 建立竞争情报系统 以监控助力企业危机公关
  14. windows资源管理器转圈崩溃
  15. 卷积神经网络 c语言代码,【CNN】卷积神经网络(示例代码)
  16. WSL Ubuntu忘记root密码和用户密码
  17. 51单片机_7-1独立按键控制流水灯方向
  18. java itextpdf 5 基础知识
  19. 数学建模微分方程导弹问题matlab求解,数学建模之微分方程(符实现例题和MATLAB源码)...
  20. nginx-proxy_redirect

热门文章

  1. python结果输出到excel-python实现数据导出到excel的示例--普通格式
  2. python图标-python实现的简版iconv
  3. python处理流程-python流程处理
  4. python编程课程上课有用吗-Python培训网络课堂|Python编程软件有哪些功能?
  5. java和python的比较-Python和Java就业前景对比
  6. python语言入门n-python面试题基础
  7. python编程入门经典实例-Python入门经典实例
  8. python与excel的差别-python对Excel按条件进行内容补充(推荐)
  9. Python eval()函数的使用
  10. SeekBar的使用(一):实现OnSeekBarChangListener