【学会动态规划】买卖股票的最佳时机 IV(18)

这篇具有很好参考价值的文章主要介绍了【学会动态规划】买卖股票的最佳时机 IV(18)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

动态规划怎么学?

1. 题目解析

2. 算法原理

1. 状态表示

2. 状态转移方程

3. 初始化

4. 填表顺序

5. 返回值

3. 代码编写

写在最后:


动态规划怎么学?

学习一个算法没有捷径,更何况是学习动态规划,

跟我一起刷动态规划算法题,一起学会动态规划!

1. 题目解析

题目链接:188. 买卖股票的最佳时机 IV - 力扣(LeetCode) 

【学会动态规划】买卖股票的最佳时机 IV(18),学会动态规划,动态规划,算法

这道题跟上一道题是一模一样啊,我的评价是,当一个 CV 工程师,

我马上 CV 出结果:

上一题的代码:

【学会动态规划】买卖股票的最佳时机 IV(18),学会动态规划,动态规划,算法

这一题的代码:

【学会动态规划】买卖股票的最佳时机 IV(18),学会动态规划,动态规划,算法

 虽然话是这么说,我们还是再做一遍这道题:

2. 算法原理

1. 状态表示

dp[ i ] 表示到第 i 天的时候,所能获得的最大利润,

实际上,我们还是可以将他分成两种情况:

买入状态和可交易状态,而且我们需要记录完成了几次交易

f [ i ][ j ] 表示第 i 天结束之后,完成了 j 次交易,处于 “买入” 状态的最大利润,

g [ i ][ j ] 表示第 i 天结束之后,完成了 j 次交易,处于 “可交易” 状态的最大利润,

这里再次说明,买入状态指的是手里有股票,

而可交易状态表示的是手里没有股票。

2. 状态转移方程

我们先从 f [ i ][ j ] 开始分析,就两种情况,一种是昨天是买入,一种是昨天是可交易状态,

买入状态啥也不干就行,可交易状态只要在今天买入就能进入买入状态,所以:

f [ i ][ j ] = max( f [ i - 1 ][ j ],g [ i - 1 ][ j ] - p [ i ] )

然后是 g [ i ][ j ] ,也是同样的两种情况,

如果是买入状态就卖出,当天的 j 是比现在小1的,如果是可交易状态,就啥也不干就行,所以:

g [ i ][ j ] = max( g[ i - 1 ][ j ],f [ i - 1 ][ j - 1 ] + p [ i ] )

3. 初始化

为了防止越界,我们需要对他进行一些特殊的处理,

然后为了防止前面的值影响后面的值,我们需要把数组内容初始化成负无穷大

然后把 f [ 0 ][ 0 ] = -p[ 0 ],让 g [ 0 ][ 0 ] = 0 即可

4. 填表顺序

从上往下,从左往右,两个表一起填

5. 返回值

g 表最后一行的最大值

3. 代码编写

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        int n = prices.size();
        vector<vector<int>> f(n, vector<int>(k + 1, -0x3f3f3f3f));
        auto g = f;
        f[0][0] = -prices[0], g[0][0] = 0;
        for(int i = 1; i < n; i++) {
            for(int j = 0; j < k + 1; j++) {
                f[i][j] = max(f[i - 1][j], g[i - 1][j] - prices[i]);
                g[i][j] = g[i - 1][j];
                if(j > 0) g[i][j] = max(g[i][j], f[i - 1][j - 1] + prices[i]);
            }
        }
        int ans = 0;
        for(auto e : g[n - 1]) ans = max(ans, e);
        return ans;
    }
};

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~文章来源地址https://www.toymoban.com/news/detail-645843.html

到了这里,关于【学会动态规划】买卖股票的最佳时机 IV(18)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法[动态规划]---买卖股票最佳时机

    1、题目: 给你一个整数数组 prices,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候最多只能持一股股票。你也可以先购买,然后在同一天出售。 返回你能获得的最大利润 。 2、 分析特点: 题目要求:在任何时候最多

    2024年02月09日
    浏览(32)
  • 算法练习Day50|● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV

    LeetCode:123.买卖股票的最佳时机III 123. 买卖股票的最佳时机 III - 力扣(LeetCode) 1.思路 将两次买入卖出转化为是否持有的状态,当天可进行两次买卖,故每天买卖有四种状态,四种状态包含了当天不买不卖的状态。 2.代码实现 3.复杂度分析 时间复杂度:O(n). 空间复杂度:O(1

    2024年02月12日
    浏览(33)
  • 算法训练第五十天 | 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

    题目链接:123.买卖股票的最佳时机III 参考:https://programmercarl.com/0123.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAIII.html 视频讲解:https://www.bilibili.com/video/BV1WG411K7AR 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所

    2024年02月01日
    浏览(29)
  • java算法day50 | ● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV

    思路: 这道题的关键就是如何设置dp数组的状态。用五种状态表示对股票持有或售出的不同阶段。代码随想录讲解视频 时间复杂度:O(n) 空间复杂度:O(n × 5) 思路: 在上一题2次的基础上变为k次。可以发现规律:除了0以外,偶数就是卖出,奇数就是买入。 因此dp数组的维度

    2024年04月11日
    浏览(32)
  • 【算法】力扣【动态规划、状态机】309. 买卖股票的最佳时机含冷冻期

    309. 买卖股票的最佳时机含冷冻期 本文介绍解决力扣平台上第309号问题——“买卖股票的最佳时机含冷冻期”的算法。这是一个中等难度的问题,其核心是通过设计一个算法来计算在给定的股票价格数组 prices 下,能够获取的最大利润。股票价格数组 prices 中的每个元素 pric

    2024年01月18日
    浏览(39)
  • ● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV

     123.买卖股票的最佳时机III     188.买卖股票的最佳时机IV 

    2024年02月12日
    浏览(28)
  • 动态规划——买卖股票的最佳时机系列题

    买卖股票有一系列题目 以下是我找出它们之间的区别: 第一题,只能买一次,从最低价入手,最高价卖出 第二题,可以买无数次,但买了之后,必须卖出之后,再来重新买入,再卖出。 第三题,只能买两次,但买了之后,必须卖出之后,再来重新买入,再卖出。 第四题,

    2024年01月17日
    浏览(41)
  • day 43 | ● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV

    ● 188.买卖股票的最佳时机IV 和买卖股票3中的思路一样,只不过从两次换成了k次

    2024年02月10日
    浏览(30)
  • 动态规划——买卖股票的最佳时机系列题Ⅱ

    这一期是和上一期是连着的,包含的题目如下: 这三个题目所需要的思路是很相近的,先给出第一个的题目。 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意:你不能同时

    2024年01月19日
    浏览(31)
  • LeetCode:121.买卖股票的最佳时机——动态规划

    🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 关于动态规划:LeetCode:322. 零钱兑换——动态规划从案例入门 题目描述 :给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只

    2023年04月17日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包