这篇page是针对leetcode上的188.买卖股票的最佳时机Ⅳ所写的。小尼先简单的说明一下这道题的意思,就是我们给定一个整数数组prices,它的第i个元素prices[i]是一支给的股票在第i天的价格。我们需要设计一个算法在我们完成k次交易的情况下我们可以赚到最大的利润。

其实这道题跟小尼上面的所写的只交易两次的题目非常的类似,只是说我们增加了交易的次数,意味着我们进行的操作没多一次交易我们将会进行的步骤就回增加两次,我们还是利用动态规划五部曲:

1.确定dp数组以及下标的含义

在动态规划:123.买卖股票的最佳时机III (opens new window)中,我是定义了一个二维dp数组,本题其实依然可以用一个二维dp数组。

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

j的状态表示为:

  • 0 表示不操作
  • 1 第一次买入
  • 2 第一次卖出
  • 3 第二次买入
  • 4 第二次卖出
  • .....

大家应该发现规律了吧 ,除了0以外,偶数就是卖出,奇数就是买入

题目要求是至多有K笔交易,那么j的范围就定义为 2 * k + 1 就可以了。

2.确定递推公式

还要强调一下:dp[i][1],表示的是第i天,买入股票的状态,并不是说一定要第i天买入股票,这是很多同学容易陷入的误区

达到dp[i][1]状态,有两个具体操作:

  • 操作一:第i天买入股票了,那么dp[i][1] = dp[i - 1][0] - prices[i]
  • 操作二:第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]也有两个操作:

  • 操作一:第i天卖出股票了,那么dp[i][2] = dp[i - 1][1] + prices[i]
  • 操作二:第i天没有操作,沿用前一天卖出股票的状态,即:dp[i][2] = dp[i - 1][2]

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

3.dp数组如何初始化

第0天没有操作,这个最容易想到,就是0,即:dp[0][0] = 0;

第0天做第一次买入的操作,dp[0][1] = -prices[0];

第0天做第一次卖出的操作,这个初始值应该是多少呢?

首先卖出的操作一定是收获利润,整个股票买卖最差情况也就是没有盈利即全程无操作现金为0,

从递推公式中可以看出每次是取最大值,那么既然是收获利润如果比0还小了就没有必要收获这个利润了。

所以dp[0][2] = 0;

第0天第二次买入操作,初始值应该是多少呢?

不用管第几次,现在手头上没有现金,只要买入,现金就做相应的减少。

第二次买入操作,初始化为:dp[0][3] = -prices[0];

所以同理可以推出dp[0][j]当j为奇数的时候都初始化为 -prices[0],在初始化的地方同样要类比j为偶数是卖、奇数是买的状态

4.确定遍历顺序

从递归公式其实已经可以看出,一定是从前向后遍历,因为dp[i],依靠dp[i - 1]的数值。

5.导出递推公式

小尼接下来拉一下这道题的解题代码:

class Solution {public int maxProfit(int k, int[] prices) {if(prices.length == 0) return 0;int len = prices.length;int[][] dp = new int[len][k*2 + 1];for(int i = 1;i < k*2; i += 2){dp[0][i] = -prices[0];}for(int i = 1;i < len ; i++){for(int j = 0; j < k*2 - 1; j += 2){dp[i][j + 1] = Math.max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i]);dp[i][j + 2] = Math.max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i]); }}return dp[len - 1][k*2];}
}

小尼简单的说明一下这道题的解题的思路,其实还是比较简单的,其实就是我们在两层递归中我们一共是进行两部操作,我们只是再将步数进行不断的重复,我们进行的第一步就是买入,这里就是对应我们的j+1的操作,我们第二步就是做卖出的操作,这里对应的步骤就是j+2的操作。我们第一层递归的是我们的物品数,我们的第二层递归的是我们的k的层数,因为每当我们增加一次交易的机会,我们的步骤就会增加两个,所以我们再循环中所设的限制就是j < k*2 - 1.

希望上面的代码可以帮助到小伙伴们~~~

My Eighty-seventh Page - 买卖股票的最佳时机 - By Nicolas相关推荐

  1. My Eighty-ninth Page - 买卖股票的最佳时机含手续费 - By Nicolas

    这篇page是针对leetcode上的714.买卖股票的最佳时机含手续费所写的.小尼先简单的说明一下这道题的意思,就是给定一个整数数组prices,其中prices[i]表示第i天的股票价格,整数fe ...

  2. 代码随想录算法训练营第三十七天 | 738.单调递增的数字,714. 买卖股票的最佳时机含手续费,968.监控二叉树,总结

    Day36 周日休息~ 一.参考资料 单调递增的数字 https://programmercarl.com/0738.%E5%8D%95%E8%B0%83%E9%80%92%E5%A2%9E%E7%9 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. SpringMVC框架中ModelAndView、Model、ModelMap的区别与使用
  2. 化工热力学 第二章(流体的 p - V - T 关系)
  3. python --- opencv部分学习
  4. java学习(108):StringBuilder连接字符串和删除操作
  5. Python学习---入门导学篇
  6. 字长为16位的计算机_必看!计算机考试基础知识总结1
  7. 笔记本电脑键盘失灵一键修复_笔记本部分按键失灵的键盘可以用了,省下键盘的钱...
  8. 【JAVA】FreeMarker学习1(Ftl)
  9. 福利来了,axure8.1注册码
  10. 渠道分销管理系统解决方案
  11. php64转码,Base64的编码转换方式
  12. 使用Dhtml和poi导出excle表格出现Error Type:LoadXMl Incorrect Json错误
  13. 第二证券|A股集体收涨,汽车产业链爆发!房地产延续强势
  14. 诺基亚wp手机安装linux,1小时搞定 普通用户3步轻松更新WP8.1
  15. Java剑开天门(二)
  16. 对接海康威视ehome踩过的坑总结
  17. [Flink基础]--什么是流处理?
  18. 图像处理之K-Means算法演示
  19. 创造与魔法java语言_《创造与魔法》最全魔法融合公式一览
  20. Allegro可供产品包含L、XL和GXL三个级别

热门文章

  1. 今天是礼拜天(转移)
  2. 关于 《IT 专业应该怎么学》
  3. Akka 指南 之「Akka 简介」
  4. TouchDesigner使用之一-下载安装
  5. Vscode去除代码中的空格行
  6. 淘宝可以找人找朋友代付款吗?
  7. 電腦android备份软件,数据备份软件哪个好 电脑/手机数据备份软件推荐
  8. Beautiful Soup简单使用
  9. Nacos服务注册与发现源码(一)之gRPC协议的实例注册
  10. 特殊多位数乘法口算算法