序言:

在数据结构与算法中的动态规划部分,买卖股票系列题目多,题解相似,值得对比总结一下。希望小伙伴们在看过这篇文章之后,可以对动态规划系列有一个清晰的认识,那么我们开始吧。

【注】本文部分参考于{代码随想录}公众号,想看详细解说的可以移步。



Leedcode121.买卖股票的最佳时机

问题描述:

股票只能买卖一次,求最大利润

解题思路:

dp[i][0] 表示第i天持有股票所剩得现金。(负的,即花了多少钱)
dp[i][1] 表示第i天不持有股票所得现金。

如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来:
(1)第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金即:dp[i - 1][0]
(2)第i天买入股票,所得现金就是买入今天的股票后所得现金即:-prices[i] 所以dp[i][0] = max(dp[i - 1][0], -prices[i]);

如果第i天不持有股票即dp[i][1], 也可以由两个状态推出来
(1)第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金即:dp[i - 1][1]
(2)第i天卖出股票,所得现金就是按照今天股票佳价格卖出后所得现金即:prices[i] + dp[i - 1][0] 所以dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);

class Solution:def maxProfit(self, prices: List[int]) -> int:dp=[[0]*2 for i in range(len(prices))]dp[0][0]=-prices[0]for i in range(1,len(prices)):dp[i][0]=max(dp[i-1][0],-prices[i])dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i])return dp[-1][1]

Leedcode122.买卖股票的最佳时机II

问题描述

可以多次买卖股票,问最大收益。

解题思路

dp[i][0] 表示第i天持有股票所得现金
dp[i][1] 表示第i天不持有股票所得最多现金

如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来
(1)第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]
(2)第i天买入股票,所得现金就是昨天不持有股票的所得现金减去 今天的股票价格 即:dp[i - 1][1] - prices[i]。【注意】这里是和上一题(121.买卖股票的最佳时机)唯一不同的地方

在上一题中,因为股票全程只能买卖一次,所以如果买入股票,那么第i天持有股票即dp[i][0]一定就是 -prices[i]。
而本题,因为一只股票可以买卖多次,所以当第i天买入股票的时候,所持有的现金可能有之前买卖过的利润。

如果第i天不持有股票即dp[i][1], 也可以由两个状态推出来
(1)第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金即:dp[i - 1][1]
(2)第i天卖出股票,所得现金就是按照今天股票佳价格卖出后所得现金即:prices[i] + dp[i - 1][0] 所以dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);

class Solution:def maxProfit(self, prices: List[int]) -> int:dp=[[0]*2 for i in range(len(prices))]dp[0][0]=-prices[0]for i in range(1,len(prices)):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])return dp[-1][1]

Leedcode123.买卖股票的最佳时机III

问题描述

最多买卖两次,问最大收益。

解题思路

一天一共就有五个状态
0. 没有操作
1.第一次买入
2.第一次卖出
3.第二次买入
4.第二次卖出

dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金。

达到dp[i][1]状态,有两个具体操作:
(1)第i天买入股票了,那么dp[i][1] = dp[i-1][0] - prices[i]
(2)第i天没有操作,而是沿用前一天买入的状态,即:dp[i][1] = dp[i - 1][1]
dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);

同理dp[i][2]也有两个操作:
(1)第i天卖出股票了,那么dp[i][2] = dp[i - 1][1] + prices[i]
(2)第i天没有操作,沿用前一天卖出股票的状态,即:dp[i][2] = dp[i - 1][2]
所以dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])

同理可推出剩下状态部分:
dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);
dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);

class Solution:def maxProfit(self, prices: List[int]) -> int:dp=[[0]*2 for i in range(len(prices))]dp[0][0]=-prices[0]for i in range(1,len(prices)):dp[i][0] = dp[i - 1][0]dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i])dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] + prices[i])dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i])dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i])return dp[-1][1]

Leedcode188.买卖股票的最佳时机IV

问题描述

最多买卖k笔交易,问最大收益。

解题思路

使用二维数组 dp[i][j] :第i天的状态为j,所剩下的最大现金是dp[i][j]

j的状态表示为:
0 表示不操作
1 第一次买入
2 第一次卖出
3 第二次买入
4 第二次卖出

也就是说:除了0以外,偶数就是卖出,奇数就是买入。

达到dp[i][1]状态,有两个具体操作:
(1)第i天买入股票了,那么dp[i][1] = dp[i - 1][0] - prices[i]
(2)第i天没有操作,而是沿用前一天买入的状态,即:dp[i][1] = dp[i - 1][1]
dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][0]);

同理dp[i][2]也有两个操作:
(1)第i天卖出股票了,那么dp[i][2] = dp[i - 1][1] + prices[i]
(2)第i天没有操作,沿用前一天卖出股票的状态,即:dp[i][2] = dp[i - 1][2]
dp[i][2] = max(dp[i - 1][i] + prices[i], dp[i][2])

class Solution:def maxProfit(self, k: int, prices: List[int]) -> int:if len(prices)==0:return 0n=2*k+1dp=[[0]*n for i in range(len(prices))] #n列for j in range(1,n,2):#初始化i=0的情况dp[0][j]=-prices[0]for i in range(1,len(prices)):for j in range(0,n-2,2):dp[i][j+1]=max(dp[i-1][j+1],dp[i-1][j]-prices[i]) #买入dp[i][j+2]=max(dp[i-1][j+2],dp[i-1][j+1]+prices[i])#卖出return dp[-1][-1]

Leedcode309.最佳买卖股票时机含冷冻期

问题描述

可以多次买卖,但每次卖出有冷冻期1天。

解题思路

dp[i][j]:第i天状态为j,所剩的最多现金为dp[i][j]。

具体可以区分出如下四个状态:

状态一:买入股票状态(今天买入股票,或者是之前就买入了股票然后没有操作)
状态二:两天前就卖出了股票,度过了冷冻期,一直没操作,今天保持卖出股票状态
状态三:今天卖出了股票
状态四:今天为冷冻期状态,但冷冻期状态不可持续,只有一天!

达到买入股票状态dp[i][0],有两个具体操作:
(1)前一天就是持有股票状态(状态一),dp[i][0] = dp[i - 1][0]
(2)今天买入了,有两种情况
(2.1)前一天是冷冻期(状态四),dp[i - 1][3] - prices[i]
(2.2)前一天是保持卖出股票状态(状态二),dp[i - 1][1] - prices[i]
2.1和2.2取最大值,即:max(dp[i - 1][3], dp[i - 1][1]) - prices[i]
即:dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3], dp[i - 1][1]) - prices[i]);

达到保持卖出股票状态dp[i][1],有两个具体操作:
(1)前一天就是状态二
(2)前一天是冷冻期(状态四)
即:dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);

达到今天就卖出股票状态dp[i][2] ,只有一个操作:
(1)昨天一定是买入股票状态(状态一),今天卖出
即:dp[i][2] = dp[i - 1][0] + prices[i];

达到冷冻期状态dp[i][3],只有一个操作:
(1)昨天卖出了股票(状态三)
即:p[i][3] = dp[i - 1][2];

class Solution:def maxProfit(self, prices: List[int]) -> int:n = len(prices)if (n<=1) return 0dp=[[0]*4 for i in range(n)]dp[0][0]=-prices[0]for i in range(1,len(prices)):dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3], dp[i - 1][1]) - prices[i])dp[i][1] = max(dp[i - 1][1], dp[i - 1][3])dp[i][2] = dp[i - 1][0] + prices[i]dp[i][3] = dp[i - 1][2]return max(dp[n - 1][3],max(dp[n - 1][1], dp[n - 1][2]))

Leedcode714.买卖股票的最佳时机含手续费

问题描述

可以多次买卖,但每次有手续费。

解题思路

相对于122.买卖股票的最佳时机II,本题只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的。

dp[i][0] 表示第i天持有股票所省最多现金。
dp[i][1] 表示第i天不持有股票所得最多现金

如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来
第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]
第i天买入股票,所得现金就是昨天不持有股票的所得现金减去 今天的股票价格 即:dp[i - 1][1] - prices[i]
即:dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);

如果第i天不持有股票即dp[i][1]的情况, 依然可以由两个状态推出来
第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1]
第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金,注意这里需要有手续费了即:dp[i - 1][0] + prices[i] - fee
所以:dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);

class Solution:def maxProfit(self, prices: List[int], fee: int) -> int:if len(prices)==0:return 0dp=[[0]*2 for i in range(len(prices))]dp[0][0]=-prices[0]for i in range(1,len(prices)):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] - fee)return max(dp[n - 1][0], dp[n - 1][1])

总结

好啦,以上就是关于动态规划中买卖股票的最佳时机的所有情况啦,喜欢的小伙伴可以点个赞哦,若是能关注就更好啦,作者会不定期更新总结Leedcode题解,以及发布一些关于机器视觉的内容~

一文总结买卖股票的最佳时机的所有情况(附Python代码)相关推荐

  1. 一文详解8种异常检测算法(附Python代码)

    文章目录 一.异常检测简介 1.1 异常检测适用的场景 1.2 异常检测存在的挑战 二.异常检测方法 2.1 基于聚类的方法 2.2 基于统计的方法 2.3 基于深度的方法 2.4 基于分类模型 2. ...

  2. python随机森林变量重要性_推荐 :一文读懂随机森林的解释和实现(附python代码)...

    原标题:推荐 :一文读懂随机森林的解释和实现(附python代码) 作者:WilliamKoehrsen:翻译:和中华:校对:李润嘉 本文约6000字,建议阅读15分钟. 本文从单棵决策树讲起,然后逐 ...

  3. LeetCode #121 买卖股票的最佳时机 贪心 单调栈 动态规划

    LeetCode #121 买卖股票的最佳时机 题目描述 给定一个数组,它的第 iii 个元素是一支给定股票第 iii 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算 ...

  4. 【每日一算法】买卖股票的最佳时机

    微信改版,加星标不迷路! 每日一算法-买卖股票的最佳时机 作者:阿广 阅读目录 1 题目 2 解析 1 题目 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔 ...

  5. 《LeetCode力扣练习》第121题 买卖股票的最佳时机 Java

    <LeetCode力扣练习>第121题 买卖股票的最佳时机 Java 一.资源 题目: 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价 ...

  6. 炒股Java_基于java计算买卖股票的最佳时机

    这篇文章主要介绍了基于java计算买卖股票的最佳时机,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 问题: 可以将问题转化为如下图所示,即求多个累计 ...

  7. 聊聊买卖股票的最佳时机

    前言 大家好,我是大赛哥,好久不见,天天想念! 最近梳理高频动态规划问题,股票问题当然是非常经典的动态规划问题,并且整个系列有好几道题,这里我整理了6道股票系列的经典问题分享给大家,咱们今天聊聊买卖股 ...

  8. Leetcode 188.买卖股票的最佳时机IV

    买卖股票的最佳时机IV 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 k 笔交易. 注意: 你不能同时参与多笔交易(你必 ...

  9. 买卖股票的最佳时机含手续费

    相对于动态规划:122.买卖股票的最佳时机II,本题只需要在计算卖出操作的时候减去手续费就可以了,代码几乎是一样的. 唯一差别在于递推公式部分 dp[i][0] 表示第i天持有股票所省最多现金. dp ...

  10. 买卖股票的最佳时机IV

    思路 这道题目可以说是动态规划:123.买卖股票的最佳时机III的进阶版,这里要求至多有k次交易. 确定dp数组以及下标的含义 在动态规划:123.买卖股票的最佳时机III中,我是定义了一个二维dp数 ...

最新文章

  1. rman 备份后恢复整个数据库文件的操作
  2. Servlet基础知识(二)——web.xml文件的作用
  3. linux 环境 安装nginx
  4. Ubuntu16.04下tensorflow安装
  5. ABAP操作Excel(转)
  6. 区域判断hdu 3681 Prison Break bfs+二分+dp
  7. NUC1372 Bull Math【大数】
  8. pytorch张量_PyTorch张量-详细概述
  9. Xcode不能真机调试运行
  10. Hbase与pegasus对比
  11. MT4红绿柱黄白线双线MACD指标
  12. Java基础(冒泡排序)
  13. 国外浏览器哪个好用?国外浏览器排名
  14. Java——课设——图书管理系统实现
  15. 如何批量在图片上加文字?
  16. isis宣告网络_ISIS是一个分级的链接状态路由协议
  17. 小米笔记本锁屏睡眠无法唤醒修复方法
  18. 输入框技巧 禁用输入法 禁用提示 提示归类
  19. sourceinsight 查看源码的利器
  20. 基于业务描述语言BDL的需求方法论

热门文章

  1. 用户行为监控(Piwik)
  2. 参加第五届“软件杯”记录
  3. android amr 播放器,Android使用createInnerAudioContext无法播放amr?
  4. SpringBoot 整合 Elasticsearch 实现海量级数据搜索
  5. 前端必备的开发工具推荐——VScode代码编辑器
  6. MySQL3_外键及查询
  7. python中data是什么意思_python中的data[:, :-1]和data[:, -1]什么意思?
  8. 7-2 矮冬瓜火锅店周年庆“冬瓜会员”查询
  9. WIN2003序列号
  10. glassfish插件_Maven嵌入式Glassfish插件-未启动