多状态Dp问题——买卖股票的最佳时机含冷冻期

目录

一,题目

二,题目接口

三,解题思路及其代码


一,题目

给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。​

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

  • 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

复制代码
输入: prices = [1,2,3,0,2]
输出: 3 
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

示例 2:

复制代码
输入: prices = [1]
输出: 0

二,题目接口

cpp 复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices) {

    }
};

三,解题思路及其代码

首先,要明确的一点便是这道题还是一个多状态的dp问题。在这样一道题里面,在每一天都会有三种状态:**1.**今天处于卖出状态。

**2.**今天处于买入状态。

**3.**今天处于冷冻期。

在明确好这些状态以后,便可以开始列举这几种状态间的转换关系了。

转换到卖出状态的情况:1.前一天处于买入状态,今天卖出股票。3.前一天处于卖出状态,这一天什么也不做。

转换到买入状态:1.前一天处于冷冻期状态,今天买入。2.前一天处于买入状态,今天啥也不做。

转换到冷冻期:1.前一天处于卖出状态。

画出状态转移图如下:

在推理完这些状态转移关系以后便可以推导出要求最大值的情况下的状态转移方程,设:f(i),g(i),x(i)分别是卖出状态,买入状态,冷冻期的最大利润。那便可以推导出如下的状态转移方程:

cpp 复制代码
 f[i] = max(x[i-1]-prices[i],f[i-1]);
 g[i] = max(f[i-1]+prices[i],g[i-1]);
 x[i] = g[i-1];

然后在完成初始化以后便可以写出这道题的动态规划解法了,代码如下:

cpp 复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        vector<int>f(n);
        auto g = f;
        auto x = f;

        f[0]= -prices[0];//初始化

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

        return max(x[n-1],g[n-1]);

    }
};

过啦!!!

相关推荐
无忧.芙桃1 小时前
位图妙用:512MB 实现 40 亿整数的存在性查询
c语言·c++·面试·哈希算法
ShineWinsu1 小时前
对于Redis:Steam、Geospatial、Hyperloglog、Bitmap、Bitfield类型的解析
数据库·c++·redis·分布式·缓存·面试·zset
朝朝辞暮i1 小时前
C++ 第 31C 课:Subscriber 到底是什么
开发语言·c++·算法
inferno2 小时前
SVN学习笔记(二)
笔记·学习·svn
殷色玫瑰2 小时前
C++ string类详解:常用接口、字符串操作与模拟实现
java·linux·c语言·开发语言·数据结构·c++
李游Leo2 小时前
HarmonyOS 7 + Spatial Recon Kit-C++:3DGS 高斯参数的非有限值隔离与可渲染性门禁【鸿蒙心迹】
开发语言·c++·3d·harmonyos
Evand J2 小时前
【MATLAB例程】三维RRT+APF路径规划与AOA-TDOA融合定位算法。附代码的下载链接
算法·matlab·路径规划·rrt·tdoa·apf·aoa
传奇开心果编程2 小时前
【ArkUI进阶练中学】第12课:应用架构演进与遗留系统迁移
学习·ui·华为·harmonyos
我想我不够好。2 小时前
装一个纯净的系统
学习
海绵宝宝转agent3 小时前
leetCode100算法开源笔记分享
笔记·算法