【动态规划】简单多状态(二)

📝前言说明:

  • 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分
  • 每题主要记录:(1)本人解法 + 本人屎山代码;(2)优质解法 + 优质代码;(3)精益求精,更好的解法和独特的思想(如果有的话)
  • 文章中的理解仅为个人理解。如有错误,感谢纠错

🎬个人简介:努力学习ing
📋本专栏:C++刷题专栏
📋其他专栏:C语言入门基础,python入门基础,C++学习笔记,Linux
🎀CSDN主页 愚润泽

你可以点击下方链接,进行不同专题的动态规划的学习

点击链接开始学习
斐波那契数列模型路径问题
简单多状态(一)简单多状态(二)
子数组系列(一)子数组系列(二)
子序列问题(一)子序列问题(二)
回文串问题两个数组dp问题(一)
两个数组的dp问题(二)01背包问题
完全背包二维的背包问题
其他

题目

  • 309. 买卖股票的最佳时机含冷冻期
    • 优质解
  • 714. 买卖股票的最佳时机含手续费
    • 个人解
  • 123. 买卖股票的最佳时机 III
    • 优质解
  • 188. 买卖股票的最佳时机 IV
    • 个人解


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

题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/description/
在这里插入图片描述

优质解

思路:

  • 本题的三状态怎么来的,本来是买(已卖) / 卖,但是本题多了一个冷冻期,限制的是当天买的行为,所以变成了三状态。已卖 + 可买 / 已卖 + 不可买 / 卖
  • dp[i]:当天结束时,最大收益。当天结束后的状态又可以再细分(开 3 * n的数组)。
    • 持股dp[0]
    • dp[1]不持股且明天不可以买
    • dp[2]不持股且明天可以买
  • 状态转移方程(当天结束的状态:由前一天状态和当天行为决定):
    • 可变成持股状态的:
      • 前一天不持股且明天可以买 + 当天买入;
      • 前一天持股 + 当天不变
    • 可变成不持股且明天不可买的:
      • 前一天持股 + 当天卖出
    • 可变成不持股且明天可买的:
      • 前一天不持股且明天可买 + 当天不变;
      • 前一天不持股且明天不可买 + 当天不变
  • 由上可推出方程
  • dp[0][i] = max(dp[2][i - 1] - price[i], dp[0][i - 1])
  • dp[1][i] = dp[0][i - 1] + price[i]
  • dp[2][i] = max(dp[1][i - 1], dp[2][i - 1])
  • 初始化:dp[0][0] = -price[0]dp[1][0] = dp[2][0] = 0
  • 填表顺序:三个一起填
  • 返回值:max(dp[1][n - 1], dp[2][n - 1])
class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size(); vector<vector<int>> dp(3, vector(n, 0));dp[0][0] = -prices[0];for(int i = 1; i < n; i++){dp[0][i] = max(dp[2][i - 1] - prices[i], dp[0][i - 1]);dp[1][i] = dp[0][i - 1] + prices[i];dp[2][i] = max(dp[1][i - 1], dp[2][i - 1]);}return max(dp[1][n - 1], dp[2][n - 1]);}
};

时间复杂度:O(n)
空间复杂度:O(n)


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

题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/description/
在这里插入图片描述

个人解

思路:

// dp[0][i] 第 i 天结束后为持股状态时的最大收益
// dp[1][i] 第 i 天结束后为不持股状态时的最大收益
// dp[0][i] = max(dp[1][i - 1] - prices[i] - fee, dp[0][i - 1]);
// dp[1][i] = max(dp[1][i - 1], dp[0][i - 1] + prices[i]);

不多说了,难度不如上一题
用时:10:00
屎山代码:

class Solution {
public:int maxProfit(vector<int>& prices, int fee) {int n = prices.size();vector<vector<int>> dp(2, vector(n, 0));dp[0][0] = -prices[0] - fee; // 让买入算手续费for(int i = 1; i < n; i++){dp[0][i] = max(dp[1][i - 1] - prices[i] - fee, dp[0][i - 1]);dp[1][i] = max(dp[1][i - 1], dp[0][i - 1] + prices[i]);}return dp[1][n - 1];}
};

时间复杂度:O(n)
空间复杂度:O(n)


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

题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/description/
在这里插入图片描述

优质解

思路:

  • 通过分析状态表示,我们发现必须要三维才能够很好的表示状态
  • 第一维:持股 / 不持股,第二维:最大利润 ,第三维:所剩交易次数

但是我们也可以把持股和不持股分出来:

  • f[i][j] : "持股"状态,第i天结束之后,完成了j次交易,的最大利润
  • g[i][j] : "不持股"状态,第i天结束之后,完成了j次交易,的最大利润

在这里插入图片描述
可见,下标直接表示交易次数
我们规定,只有在卖出的时候,交易次数才++
则状态转移方程:

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

初始化(其实是解决越界行为):

  • 初始时,交易次数为 1 和 2 的初始化
    • 我们可以让f[0][1] = f[0][2] = - INT_MAX / 2,即:取最小值(比所有可能的结果都小),使得该位置不会被下一天max选到,从而不影响正常的状态转移(g同理)
    • /2的原因:因为g[i - 1][j] - prices[i]会导致负数溢出,所以控制一下
  • f[i - 1][j - 1] + prices[i]的操作:j - 1会越界
    • 而这个式子中j等于0是无意义的,因为如果当天有卖出行为,则g[i][j]j一定 >= 1
    • 因此,我们可以把式子变换成:
g[i][j] = g[i - 1][j];
if(j > 1)g[i][j] = max(g[i - 1][j], f[i - 1][j - 1] + prices[i]);
  • 是从第1天开始填的,基于第0天,所以:f[0][0] = -p[0]g[0][0] = 0

代码:

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

时间复杂度:O(n)
空间复杂度:O(n)


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

题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/description/
在这里插入图片描述

个人解

思路:

  • 和上一题一样

用时:6:00
屎山代码:

class Solution {
public:int maxProfit(int k, vector<int>& prices) {int n = prices.size();vector<vector<int>> f(n, vector<int>(k + 1, -INT_MAX/2));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; j++){f[i][j] = max(f[i - 1][j], g[i - 1][j] - prices[i]);g[i][j] = g[i - 1][j];if(j >= 1)g[i][j] = max(g[i - 1][j], f[i - 1][j - 1] + prices[i]);}}int ans = 0;for(int i = 0; i <= k; i++)ans = max(ans, g[n - 1][i]);return ans;}
};

时间复杂度: O ( n ∗ k ) O(n * k) O(nk)
空间复杂度: O ( n ∗ k ) O(n * k) O(nk)


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何选择支持AI接入的开发语言与框架

选择支持AI接入的开发语言与框架 在AI系统开发中,语言和框架的选择不仅决定了代码实现方式,更深刻影响模型服务的接入效率、调用方式、性能表现和未来的可维护性。相比传统后端系统的语言选择只需关注并发性能或生态成熟度,AI架构下的开发语言必须同时满足以下几类能力: 具…

计算机视觉与深度学习 | Python实现CEEMDAN-ABC-VMD-DBO-CNN-LSTM时间序列预测(完整源码和数据)

以下是一个结合CEEMDAN、ABC优化VMD、DBO优化CNN-LSTM的完整时间序列预测实现方案。该方案包含完整的数据生成、算法实现和模型构建代码。 完整实现代码 import numpy as np import pandas as pd from PyEMD import CEEMDAN from vmdpy import VMD from sklearn.preprocessing…

React19源码系列之渲染阶段performUnitOfWork

在 React 内部实现中&#xff0c;将 render 函数分为两个阶段&#xff1a; 渲染阶段提交阶段 其中渲染阶段可以分为 beginWork 和 completeWork 两个阶段&#xff0c;而提交阶段对应着 commitWork。 在之前的root.render过程中&#xff0c;渲染过程无论是并发模式执行还是同…

c# 解码 encodeURIComponent

在C#中&#xff0c;如果你需要解码由encodeURIComponent方法编码的URL&#xff0c;你可以使用System.Web命名空间中的HttpUtility.UrlDecode方法。这个方法可以处理由JavaScript的encodeURIComponent方法编码的字符串。 首先&#xff0c;确保你的项目中引用了System.Web命名空…

Python学习心得:代码森林的冒险

第一章&#xff1a;迷雾中的第一步 林然从未想过自己会与代码结缘。那是一个平淡的周六清晨&#xff0c;阳光穿过窗帘&#xff0c;洒在她那台老旧的笔记本电脑上。屏幕上&#xff0c;Python的安装界面静静地等待着她的决定。她是一个文科生&#xff0c;大学主修社会学&#xf…

展示了一个三轴(X, Y, Z)坐标系!

等轴测投影”&#xff08;isometric projection&#xff09;风格的手绘风格三维图&#xff0c;即三条坐标轴&#xff08;x₁, x₂, x₃&#xff09;看起来彼此垂直、等角分布&#xff08;通常是 120 夹角&#xff09;&#xff0c;它是常见于教材和数学书籍的 “假三维”表示法。…

计算机网络 - 2.基础协议

1.TCP协议 1.TCP(Transmission Control Protocol):传输控制协议2.TCP协议是一种面向连接的、可靠的、 基于字节流的传输层通信协议 1.面向连接:两个使用TCP协议的应用(通常一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接2.可靠的 1.数据传输之前都要建立…

前端之vue3创建基本工程,基本登录、注册等功能的完整过程

此文也是为了做一个基本学习用的vue3创建项目的过程&#xff0c;包含基本的登录页面、登出页面、基本的router跳转、axios调用、登录验证等内容。与项目&#xff1a; https://gitee.com/rainpet/java-web-demo/tree/master/spring-security01 可以配套使用。 如下为主要过程。 …

如果有三个服务实例部署在三台不同的服务器上,这三个服务实例的本地缓存,是存储一模一样的数据?还是各自只存一部分?

✅ 答案是&#xff1a;通常每个服务实例都会独立地缓存它自己访问过的数据&#xff0c;这些数据可能是相同的&#xff0c;也可能是不同的&#xff0c;取决于请求的内容。 &#x1f4cc; 举个例子说明 假设你有一个商品详情页的服务&#xff0c;部署了 3 个服务实例&#xff08…

九州未来十三载:开源赋能 智启未来

2012年&#xff0c;九州未来以“开源赋能云边变革”为使命&#xff0c;开启中国开放云边基础架构服务的探索之路。十三载坚守深耕&#xff0c;我们始终以开源为翼&#xff0c;以算力为基&#xff0c;在科技浪潮中砥砺前行&#xff0c;见证并推动着AI时代的算力变革。 坚守初心丨…

Axure项目实战:智慧运输平台后台管理端-订单管理1(多级交互)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:订单管理 主要内容:条件组合、中继器筛选、表单跟随菜单拖动、审批数据互通等 应用场景…

WebAssembly:开启跨平台高性能编程的新时代

在当今的互联网时代&#xff0c;Web 应用的复杂性和性能要求越来越高。从简单的网页浏览到复杂的在线游戏、实时数据处理和图形渲染&#xff0c;开发者需要一种能够兼顾性能和兼容性的技术。WebAssembly&#xff08;简称 Wasm&#xff09;应运而生&#xff0c;它作为一种新兴的…

大数据治理:理论、实践与未来展望(二)

书接上文 文章目录 七、大数据治理的未来发展趋势&#xff08;一&#xff09;智能化与自动化&#xff08;二&#xff09;数据隐私与安全的强化&#xff08;三&#xff09;数据治理的云化&#xff08;四&#xff09;数据治理的跨行业合作&#xff08;五&#xff09;数据治理的生…

计算机视觉与深度学习 | Matlab实现EMD-GWO-SVR、EMD-SVR、GWO-SVR、SVR时间序列预测(完整源码和数据)

以下是一个完整的Matlab时间序列预测实现方案,包含EMD-GWO-SVR、EMD-SVR、GWO-SVR和SVR四种方法的对比。代码包含数据生成、信号分解、优化算法和预测模型实现。 %% 主程序:时间序列预测对比实验 clc; clear; clearvars; close all;% 生成模拟时间序列数据 rng(1); % 固定随…

RabbitMQ核心特性——重试、TTL、死信队列

一、重试机制 在消息传输过程中&#xff0c;可能遇到各种问题&#xff0c;如网络故障&#xff0c;服务器不可用等&#xff0c;这些问题可能导致消息处理失败&#xff0c;因此RabbitMQ提供了重试机制&#xff0c;允许消息处理失败后重新发送&#xff0c;但是&#xff0c;如果是因…

MVCC实现原理

MVCC的基本概念 MVCC&#xff0c;一个数据的多个版本&#xff0c;使得读写操作没有冲突。 在多个事务并发的情况下&#xff0c;确定到底要访问哪个版本。 MVCC实现原理 MVCC实现依赖于隐式字段&#xff0c;undo log日志&#xff0c;readView 隐式字段 在mysql用户自定义的…

湖北理元理律师事务所债务优化方案解析:如何科学规划还款保障生活质量

在当前经济环境下&#xff0c;债务问题已成为困扰许多家庭的重要难题。据相关统计数据显示&#xff0c;我国个人负债率呈现逐年上升趋势&#xff0c;如何合理规划还款、保障基本生活质量成为亟待解决的社会问题。湖北理元理律师事务所基于多年实务经验&#xff0c;研发出一套科…

ffmpeg 转换视频格式

使用FFmpeg将视频转换为MP4格式的常用命令&#xff1a; ffmpeg -i input.mov -c:v libx264 -crf 23 -c:a aac output.mp4 -i input.avi&#xff1a;指定输入文件 -c:v libx264&#xff1a;使用H.264视频编码器 -crf 23&#xff1a;控制视频质量&#xff08;范围18-28&#…

LLM Tuning

Lora-Tuning 什么是Lora微调&#xff1f; LoRA&#xff08;Low-Rank Adaptation&#xff09; 是一种参数高效微调方法&#xff08;PEFT, Parameter-Efficient Fine-Tuning&#xff09;&#xff0c;它通过引入低秩矩阵到预训练模型的权重变换中&#xff0c;实现无需大规模修改…

实现tdx-hs300-mcp

文章目录 项目简介功能说明使用方法配置说明项目简介 tdx-hs300-mcp是一个Model Context Protocol (MCP)的服务 功能说明 下载数据自动保存为CSV格式文件使用方法 确保已安装Python 3.7+和依赖库: pip install pytdx fastapi uvicorn启动MCP服务: mcp run MCP.py使用MCP工具…