动态规划-简单多状态dp问题2

文章目录

  • 1. 买卖股票的最佳时机含冷冻期(309)
  • 2. 买卖股票的最佳时机含手续费(714)
  • 3. 买卖股票的最佳时机 III(123)
  • 4. 买卖股票的最佳时机 IV(188)


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

题目描述:
在这里插入图片描述
状态表示:
由题目和经验可知,本题可分为三种状态,分别是买入,可交易,以及冷冻期,因此分别建立f[i],g[i],h[i]来表示达到第i天结尾到达的状态所能够得到的最大利润。
状态转移方程:
第i天结束要到达买入状态,前一天结束到达状态可以是可交易状态以及买入状态,所以f[i]=max(g[i-1]-prices,f[i-1])。第i天结束要到达可交易状态,前一天结束到达状态可以是冷冻期以及可交易状态,所以g[i]=max(h[i-1],g[i-1])。同理,h[i]=max(f[i-1]+prices,g[i-1])。
初始化:
为了壁面越界要初始化f[0],g[0],h[0]。
填表顺序:
都是从左至右。
返回值:
f,h,g三个数组最后一个元素中的最大值。
代码如下:

class Solution {
    public int maxProfit(int[] prices) {
        int n = prices.length;

        int[] f = new int[n];// 买入
        int[] g = new int[n];// 可交易
        int[] h = new int[n];// 冷冻期

        f[0] = -prices[0];

        for (int i = 1; i < n; i++) {
            f[i] = Math.max(g[i - 1] - prices[i], f[i - 1]);
            g[i] = Math.max(h[i - 1], g[i - 1]);
            h[i] = Math.max(f[i - 1] + prices[i], g[i - 1]);
        }

        return Math.max(f[n - 1], Math.max(g[n - 1], h[n - 1]));

    }

}

题目链接
时间复杂度:O(n)
空间复杂度:O(n)

2. 买卖股票的最佳时机含手续费(714)

题目描述:
在这里插入图片描述
状态表示:
由题目要求和经验可得此题由两种状态买入以及可交易,因此设置两个数组f[i],g[i]分别表示i位置该状态能获得的最大利润。
状态转移方程:
第i天结束时是买入状态,那么前一天结束可能是买入状态或者是可交易状态,f[i]=max(f[i-1],g[i-1]-price-fee)。第i天结束时是可交易状态,那么前一天结束可能是可交易状态或者是买入状态,g[i]=max(g[i-1],f[i-1]+price)。
初始化:
为了防止越界需要初始化f[0]以及g[0],这里初始化要注意f[0]需要减去一个fee,因为从逻辑上这里也算一次交易的开始所以需要减去一个fee,因为在这里的代码中我是选择在买入股票时减去fee的。
填表顺序:
都是从左至右。
返回值:
max(f[n-1],g[n-1])。
代码如下:

class Solution {
    public int maxProfit(int[] prices, int fee) {
        int n = prices.length;

        int[] f = new int[n];
        int[] g = new int[n];

        f[0] = -prices[0] - fee;

        for (int i = 1; i < n; i++) {
            f[i] = Math.max(f[i - 1], g[i - 1] - prices[i] - fee);
            g[i] = Math.max(g[i - 1], f[i - 1] + prices[i]);
        }

        return Math.max(f[n - 1], g[n - 1]);
    }
}

题目链接
时间复杂度:O(n)
空间复杂度:O(n)

3. 买卖股票的最佳时机 III(123)

题目描述:
在这里插入图片描述
状态表示:
这题和上一题的状态表示一致,f[i]和g[i]分别表示第i天结束时到达买入以及可交易状态,但是要加上一个维度去表示交易次数,这里设置当卖出股票时交易完成一次即交易次数加一。
状态转移方程:
状态转移方程和上题类似因此这里直接给出f[i][j]=max(f[i-1][j],g[i-1][j]-prices),g[i][j]=max(g[i-1][j],f[i-1][j-1]+price),这里的j-1当j=0时就会出问题,所以先将g[i][j]赋值为g[i-1][j],再判断j的大小,如果j合理则g[i][j]=max(g[i][j],f[i-1][j-1]+price)。
初始化:
初始化f[0][j]以及g[0][j],因为这里的交易次数有限所以逻辑上要尽量节省交易次数避免在同一天多次买入和卖出,为了避免影响要将f[0][1],f[0][2]赋为无穷小,g[0][1]和g[0][2]也是一样。
填表顺序:
从左至右,从上至下。
返回值:
返回g[i][j]最后一排的最大值,因为逻辑上f表示买入,既然手里还有股票就不可能达到最大利润。
代码如下:

class Solution {
    public int maxProfit(int[] prices) {
        int n = prices.length;

        int[][] f = new int[n][3];
        int[][] g = new int[n][3];

        f[0][0] = -prices[0];
        f[0][1] = -0x3f3f3f;
        f[0][2] = -0x3f3f3f;

        g[0][1] = -0x3f3f3f;
        g[0][2] = -0x3f3f3f;

        for (int i = 1; i < n; i++) {
            for (int j = 0; j < 3; j++) {
                f[i][j] = Math.max(f[i - 1][j], g[i - 1][j] - prices[i]);
                g[i][j] = g[i - 1][j];
                if (j - 1 >= 0) {
                    g[i][j] = Math.max(g[i][j], f[i - 1][j - 1] + prices[i]);
                }
            }

        }
        int max = 0;
        for (int i = 0; i < 3; i++) {
            if (g[n - 1][i] > max) {
                max = g[n - 1][i];
            }
        }

        return max;

    }
}

题目链接
时间复杂度:O(n)
空间复杂度:O(n)

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

题目描述:
在这里插入图片描述
题目解析:
这题就是将上题的最多2次交易换成了k,代码照着写即可,不过要注意一个细节,如果交易次数太大要将交易次数减为prices数组长度的一半提高效率。
代码如下:

public int maxProfit(int k, int[] prices) {
        int n = prices.length;
        k = Math.min(n / 2, k);

        int[][] f = new int[n][k + 1];
        int[][] g = new int[n][k + 1];

        f[0][0] = -prices[0];
        for (int i = 1; i <= k; i++) {
            f[0][i] = -0x3f3f3f;
            g[0][i] = -0x3f3f3f;
        }

        for (int i = 1; i < n; i++) {
            for (int j = 0; j <= k; j++) {
                f[i][j] = Math.max(f[i - 1][j], g[i - 1][j] - prices[i]);
                g[i][j] = g[i - 1][j];

                if (j - 1 >= 0) {
                    g[i][j] = Math.max(g[i][j], g[i - 1][j] + prices[i]);
                }
            }
        }

        int max = 0;
        for (int i = 0; i <= k; i++) {
            max = Math.max(max, g[n - 1][i]);
        }

        return max;
    }

题目链接
时间复杂度:O(n^2)
空间复杂度:O(n^2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/542477.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ELK】ELK企业级日志分析系统

搜集日志&#xff1b;日志处理器&#xff1b;索引平台&#xff1b;提供视图化界面&#xff1b;客户端登录 日志收集者&#xff1a;负责监控微服务的日志&#xff0c;并记录 日志存储者&#xff1a;接收日志&#xff0c;写入 日志harbor&#xff1a;负责去连接多个日志收集者&am…

年龄与疾病c++

题目描述 某医院想统计一下某项疾病的获得与否与年龄是否有关&#xff0c;需要对以前的诊断记录进行整理&#xff0c;按照0-18岁、19-35岁、36-60岁、61以上&#xff08;含61&#xff09;四个年龄段统计的患病人数以及占总患病人数的比例。 输入 共2行&#xff0c;第一行为过…

2440栈的实现类型、b系列指令、汇编掉用c、c调用汇编、切换工作模式、初始化异常向量表、中断处理、

我要成为嵌入式高手之4月11日51ARM第六天&#xff01;&#xff01; ———————————————————————————— b指令 标签&#xff1a;表示这条指令的名称&#xff0c;可跳转至标签 b指令&#xff1a;相当于goto&#xff0c;可随意跳转 如&#xff1a;fini…

Vivado Design Suite中的增量实现和增量模式

Vivado Incremental&#xff08;增量&#xff09;是Xilinx FPGA设计工具中的一种功能&#xff0c;它允许对设计的一部分进行修改和重新编译&#xff0c;而不需要对整个设计进行重新编译。这种增量式的方法可以显著减少编译时间&#xff0c;特别是在进行小的修改或迭代开发时。 …

粒子群优化算法PSO与鹈鹕优化算法(POA)求解无人机三维路径规划(MATLAB代码)

一、无人机路径规划模型介绍 二、算法介绍 close all clear clc dbstop if all error warning (off) global model model CreateModel(); % 创建模型 FF1; [Xmin,Xmax,dim,fobj] fun_info(F);%获取函数信息 pop100;%种群大小(可以自己修改) maxgen100;%最大迭代次数(可以自己…

成功转行Python工程师,年薪30W+,经验总结都在这!

都说郎怕入错行&#xff0c;行业对职场人的影响不言而喻。我们身边有很多和自己起点差不多的人&#xff0c;读了差不多的高中&#xff0c;差不多的大学&#xff0c;但是有的人突然一飞冲天&#xff0c;大House、移民、海外置业、全球旅行成了最常见的话题&#xff0c;出入私立医…

LeetCode18: 四数之和

目录 题目&#xff1a; 题解&#xff1a; 代码&#xff1a; 题目&#xff1a; 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元…

【C++】STL学习之vector的使用

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 前言一、默认成员函数1.1 默认构造1.2 拷贝构造1.3 析构函数1.4 赋值重载 二、迭…

【STK】手把手教你利用STK进行导弹和反导仿真04 - STK/MMT模块04 导弹飞行工具应用案例

【STK】手把手教你利用STK进行导弹和反导仿真04 - STK/MMT模块04 导弹飞行工具应用案例 这个案例将把范围轮廓导出到STK,以此来分析如何放置发射点和落点位置,然后使用它们来定义MFT中的飞行导弹。最后将生成的轨迹导出到STK进行显示和分析。 (1)第一步启动STK并创建新场景。…

LeetCode-705. 设计哈希集合【设计 数组 哈希表 链表 哈希函数】

LeetCode-705. 设计哈希集合【设计 数组 哈希表 链表 哈希函数】 题目描述&#xff1a;解题思路一&#xff1a;超大数组解题思路二&#xff1a;拉链法解题思路三&#xff1a;定长拉链数组 题目描述&#xff1a; 不使用任何内建的哈希表库设计一个哈希集合&#xff08;HashSet&…

算法设计与分析实验报告c++实现(最近点对问题、循环赛日程安排问题、排序问题、棋盘覆盖问题)

一、实验目的 1&#xff0e;加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1、 最…

leetCode刷题 27. 移除元素

目录 1.思路&#xff1a; 2.解题方法&#xff1a; 3.复杂度&#xff1a; 4.Code 题目&#xff1a; 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须…

设备树的概念、设备树如何变成device、与driver的匹配

在平台总线驱动模型中资源和驱动已经从逻辑上和代码组织上进行了分离&#xff0c;但每次调整资源还是会涉及到内核&#xff0c;所以现在更加流行的是设备树方式。设备树的好处是通过独立于内核存在&#xff0c;这样如果设备上外设功能启用与否以及位置变动的话很多时候不用修改…

【论文速读】| 基于大语言模型的模糊测试技术

本次分享论文为&#xff1a;Large Language Models Based Fuzzing Techniques: A Survey 基本信息 原文作者&#xff1a;Linghan Huang, Peizhou Zhao, Huaming Chen, Lei Ma 作者单位&#xff1a;悉尼大学&#xff1b;东京大学&#xff1b;阿尔伯塔大学 关键词&#xff1a;…

8. Spring Boot 配置文件

源码地址&#xff1a;SpringBoot_demo 本篇文章内容源码位于上述地址的com/chenshu/springboot_demo/config包下 1. 配置文件是什么 上节说到&#xff0c;Spring Boot的项目分为三个部分&#xff1a;源代码目录、资源目录、单元测试目录。 而配置文件的位置就位于资源目录res…

Python-VBA函数之旅-delattr函数

目录 1、 delattr函数&#xff1a; 1-1、Python: 1-2、VBA&#xff1a; 2、相关文章&#xff1a; 个人主页&#xff1a;https://blog.csdn.net/ygb_1024?spm1010.2135.3001.5421 delattr函数在Python中具有广泛的应用场景&#xff0c;主要用于动态地管理对象的属性。常用…

Python十大最佳实践:高效Python编程的十个关键方法

在当今的软件开发世界中&#xff0c;Python是一种极其重要且广泛使用的编程语言。以下是Python编程的十大最佳实践&#xff0c;这些实践将帮助你提升编程效率&#xff0c;优化代码质量&#xff0c;以及更好地应用Python的强大功能。 1.理解Pythonic的方式 “Pythonic”是指遵循…

傲基科技冲刺上市:依赖单一产品,元气未恢复,有股东提前退出

近日&#xff0c;傲基科技股份有限公司&#xff08;下称“傲基科技”&#xff09;递交招股书&#xff0c;准备在港交所主板上市&#xff0c;华泰证券为其独家保荐人。 据招股书介绍&#xff0c;傲基科技是一家提供家具家居类产品的品牌运营商及出口物流服务商。傲基科技在招股…

Java+vue2+springboot智慧班牌系统源码,支持PC端、移动客户端、电子班牌端,SaaS模式部署

智慧班牌作为一个班级的标识&#xff0c;也是班级空间日常管理的载体&#xff0c;作为班级文化展示交流窗口与学科教学、德育管理&#xff0c;以及学校信息収布等有机结合起来&#xff0c;作为学生展示的平台&#xff0c;又可应用于普及教育安全知识和科学文化&#xff0c;拓展…

Python爬虫:requests模块的基本使用

学习目标&#xff1a; 了解 requests模块的介绍掌握 requests的基本使用掌握 response常见的属性掌握 requests.text和content的区别掌握 解决网页的解码问题掌握 requests模块发送带headers的请求掌握 requests模块发送带参数的get请求 1 为什么要重点学习requests模块&…