步骤一、确定状态:

确定dp数组及下标含义

dp[i] 表示的是在第i天可以获取的最大利润,每天会有持有股票和不持有 股票两种状态,这个是第二维度,还是用0和1表示。 而对于每一种状态, 这里还会有交易次数的记录k次, 这个是第三维度。所以dp[天数][当前是 否持股][卖出的次数]

步骤二、推断状态方程:

未持有股票的状态 dp[i][0][k]系列 如果k=0的话,那么还是dp[i][0][0]等于0,开始的状态
如果k>0的话, 未持有表示要么延续之前的状态,要么是当天卖了出去 延续之前的状态, 即dp[i-1][0][k] 当天卖了出去,说明前一天是持有股票的, 即dp[i-1][1][k-1]+prices[i] 这里取最大就是 dp[i][0][k]=max(dp[i-1][0][k], dp[i-1][1][k-1]+prices[i])

持有股票的状态dp[i][1][k]系列

如果k=0的话, 说明是第一次买入的状态, 此时利润要么是延续之前的,要么 是今天刚买的

延续之前的, 即dp[i-1][1][0]

今天刚买的, 即昨天是没有股票的, dp[i-1][0][0]-prices[i]

所以这里取最大是dp[i][1][0] = max(dp[i-1][1][0], dp[i-1][0][0]-prices[i])

如果k>0,也是这个思路, dp[i][1][k-1] = max(dp[i-1][1][k-1], dp[i-1][0][k- 1]-prices[i])

同样的,等于k取不到,因为这时候已经完成了K笔交易,不能再买了。 dp[i][1][k]=float("-inf")

步骤三、规定初始条件:

初始条件:

全局初始化为0, 然后第0天的所有状态必须都初始化出来: dp[0][0][0] = 0: 开始啥也没干, 利润0;

dp[0][1][0] = -prices[0]: 第0天持有股票,且进行了0次 交易,这是第一次买入,利润-prices[0]

步骤四、计算顺序:

遍历方式会是两层循环了,首先会从1到len(prices)遍历天, 然后再从1到k遍历交易次数,正向遍历

class Solution:def maxProfit(self, k: int, prices: List[int]) -> int:if len(prices) < 2 or k == 0:return 0# dp[天数][当前是否持股][卖出的次数]dp = [[[0 for _ in range(k+1)] for _ in range(2)] for _ in range(len(prices))]# 初始化dp[0][0][0], dp[0][1][0] = 0, -prices[0]for i in range(1, k):dp[0][0][i], dp[0][1][i] = float("-inf"), float("-inf") # 第一天完不成交易# 遍历for i in range(1, len(prices)):for k in range(1, k+1):dp[i][0][k] = max(dp[i-1][0][k], dp[i-1][1][k-1] + prices[i])dp[i][1][k-1] = max(dp[i-1][1][k-1], dp[i-1][0][k-1] - prices[i])# 最后一天不持有股票的值return max(dp[-1][0])

108. Leetcode 188. 买卖股票的最佳时机 IV (动态规划-股票交易)相关推荐

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

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

  2. LeetCode 188. 买卖股票的最佳时机 IV(动态规划)

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

  3. leetcode 188. 买卖股票的最佳时机 IV(dp)

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

  4. 107. Leetcode 123. 买卖股票的最佳时机 III (动态规划-股票交易)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i] 表示的是在第i天可以获取的最大利润,每天会有持有股票和不持有股票两种状态,这个是 第二维度,还是用0和1表示. 而对于每一种状态,这里还会有交易 ...

  5. 106. Leetcode 122. 买卖股票的最佳时机 II (动态规划-股票交易)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i]是一个长度为len(prices)的一维数组,表示的是在第i天持有股票 步骤二.推断状态方程: 第i天持有股票,即dp[i][1], 那么两个状态 ...

  6. 算法训练第五十天 | 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

    动态规划part11 123.买卖股票的最佳时机III 题目描述 思路 拓展 188.买卖股票的最佳时机IV 题目描述 思路 易错点 123.买卖股票的最佳时机III 题目链接:123.买卖股票的最佳 ...

  7. 【第50天| ● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV 】

    123.买卖股票的最佳时机III class Solution {public:int maxProfit(vector<int>& prices) {vector<int& ...

  8. 第43天| 123.买卖股票的最佳时机III、 188.买卖股票的最佳时机IV

    1.题目链接:123. 买卖股票的最佳时机 III 题目描述: 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易 ...

  9. 188. 买卖股票的最佳时机 IV(JavaScript)

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

最新文章

  1. Linux 内核源代码分析 chap 2 存储管理 (5)
  2. 用python画图-用python进行简单的画图操作
  3. 《编译与反编译技术》——第一章 引论 1.1节编译器与解释器
  4. elastic search java_elasticsearch学习四、JAVA调用
  5. erdas遥感图像几何校正_定量/高光谱遥感之—光谱分析技术
  6. javascript练习----复选框全选,全不选,反选
  7. R语言聚类算法之期望最大化聚类(Expectation Maximization Algorithm)
  8. python调包侠_sklearn调包侠之K-Means
  9. UVA455 - Periodic Strings(周期串)
  10. Centos6.5安装FastDFS
  11. android 关闭服务代码,android – 调用stopService方法时,服务不会停止
  12. sympy 求微分方程_Sympy笔记一
  13. Atitti usrQBf1801 翻页控件规范  v2
  14. 【FPGA教程案例66】硬件开发板调试6——基于FPGA的UDP网口通信和数据传输
  15. 大华(华瑞)MVP网络通讯教程实例
  16. 【时间序列】ICDE 2021丨时间序列相关研究论文汇总
  17. 超全万字汇总!科研论文绘图实操干货!11类Matplotlib图表,含代码
  18. MATLAB常用快捷键:自动补全、自动排版、注释、去掉注释
  19. 博瑞森mysql培训_MySQL DBA高级视频教程 博瑞森一线DBA大神亲授
  20. 【Gulimall】Spring Cloud:spring-cloud-gateway、spring-cloud-openfeign,Alibaba的注册+配置中心Nacos

热门文章

  1. js 获取今天以及前一周/前20天时间
  2. proguard的简单配置说明
  3. Socket编程基本流程实践
  4. linux 单独取出本机IP地址
  5. 当一个有性能问题的数据库摆在你的面前,作为责任人,你的处理思路是什么?...
  6. oracle asm之添加和修改asm磁盘组
  7. AT89C51 单片机在电话远程控制器中的应用
  8. 得到INSERT和UPDATE中使用的值
  9. PAT甲级1139 First Contact (30 分):[C++题解] 图论、暴力枚举两个点、hash映射
  10. 李永乐线性代数手写笔记-向量