动态规划- 股票问题专题(详解+多例子+源码)

动态规划做题思路

像这种股票问题,我们首先想多状态动态规划 ,先分析

① 状态表示: dp[ i ]表示什么

我们这里用的是多状态,所以不用dp命名,用f[ i ]和 g[ i ]命名

一般我们 用 f[ i ]表示第 i 天当前手中持有股票最大收益

               用g[ i ]表示第 i 天当前手中未持有股票最大收益

当然如果有其他的情况要分析是否需要其他状态 需要具体分析

②状态转移方程

因为我们用的是多状态,所以我们要分析没个状态是否可以由其他状态得到 怎么得到的,或者由自己得到,一定要分析全面 

状态转移要根据状态表示来推导,我们状态表示是最大收益,就要将可以转移到该状态的所有情况取最大值,填入到当前值中 如果有其他状态表示 根据具体分析即可

买股票的最佳时机含冷冻期 (medium)

首先先解释题目:我们可以进行多次交易,但是当我们卖出股票的时候,我们会被冷冻一天,这一天中不能进行买股票行为

 

 像这种买股票的问题,我们可以用多状态动态规划来解决(直接秒杀)需要分析

如上图 :因为含冷冻期,我们把冷冻期的状态也加上,具体分析画出状态积 

F可以从未持有股票进行一次购买转移得到,也可以由自己无需操作得到

G可以从冷冻期第二天解冻得到,也可以有自己无需操作的到

T只可以从上一天卖出股票转换得到

分析出了每种状态的转移方程,只需要对每种状态取最大值即可

class Solution {
public:int maxProfit(vector<int>& prices) {int n=prices.size();vector<vector<int>>dp(n,vector<int>(3));dp[0][0]=-prices[0];dp[0][1]=dp[0][2]=0;//dp[i][0]当前状态是买入//dp[i][1]当前状态是可交易//dp[i][2]当前状态被冻结for(int i=1;i<n;i++){dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i]);dp[i][1]=max(dp[i-1][1],dp[i-1][2]);dp[i][2]=dp[i-1][0]+prices[i];}return max(max(dp[n-1][0],dp[n-1][1]),dp[n-1][2]);}
};

 

 买股票的最佳时机含手续费(medium)

解释题目:这次不含冷冻期,但是每次交易需要付手续费,还是可以多次交易 。首先我们要明确一次交易,我们可以在买入的时候付手续费,卖出的时候就不需要再付,或者买入的时候不付,卖出的时候付手续费,这里我们都以卖出的时候付手续费

还是先分状态,这题只需要分两种状态,直接画出状态积,分析每种状态如何转化:

F(持有)可以由上一天的持有状态,什么都不做转化来,也可以上天手中未持有股票,通过买入操作转化来

G(未持有)可以由上一天未持有 什么都不做转化来,还可以上一天手中持有股票,进行卖出操作(同时需要付手续费)转化来

所以状态转移方程就的到了

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

 买股票的最佳时机Ⅲ(hard)

这道题没有手续费,没有冷冻期,但是只可以进行两次交易,我们还是需要明确一次交易的概念,只可以进行两次 

 

这次我们需要定义五个状态,每个状态表示如图,我们只需要模拟这两次购买 即可的到状态积,很容易分析出状态转移方程,其中G0一直都是0 因为我们一直没有进行购买操作,手中什么都没有。 

class Solution {
public:int maxProfit(vector<int>& prices) {int n=prices.size();vector<int>G0(n);vector<int>G1(n);vector<int>G2(n);vector<int>F1(n);vector<int>F2(n);F1[0]=-prices[0];F2[0]=-prices[0];//从第二个元素开始填for(int i=1;i<n;i++){F1[i]=max(G0[i-1]-prices[i],F1[i-1]);G1[i]=max(F1[i-1]+prices[i],G1[i-1]);F2[i]=max(G1[i-1]-prices[i],F2[i-1]);G2[i]=max(F2[i-1]+prices[i],G2[i-1]);}return G2[n-1];}
};

 买股票的最佳时机Ⅳ(hard)

类比上一道题:

在我们上一道题填表的时候 :

可以看到十分的有规律,上道题只能交易两次,但是这道题只能交易k次,所以两道题几乎一样

class Solution {
public:int maxProfit(int k, vector<int>& prices) {const int INF = 0x3f3f3f3f;// 处理⼀个细节问题int n = prices.size();k = min(k, n / 2);// 创建 dp 表// 初始化// 填表// 返回值vector<vector<int>> f(n, vector<int>(k + 1, -INF));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][j], f[i - 1][j - 1] + prices[i]);}}int ret = 0;for (int j = 0; j <= k; j++)ret = max(ret, g[n - 1][j]);return ret;}
};

 

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

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

相关文章

kaggle无法注册怎么办

在浏览kaggle网站&#xff0c;或者是参加kaggle竞赛时&#xff0c;常常会遇到需要登陆kaggle账号的情况。而在注册时&#xff0c;却发现无论如何也无法弹出人机识别的验证码&#xff0c;导致无法注册成功。本文会手把手的讲解一种注册kaggle的方法&#xff08;edge浏览器&#…

LeetCode45:跳跃游戏Ⅱ

题目描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n …

确定性最大似然(DML)估计测角

1. 最大似然函数 贝叶斯方法是基于统计理论的一种经典方法&#xff0c;适合于有关参数估计问题。最大似然 (Maximum Likelihood&#xff0c;ML) 估计方法就是贝叶斯估计方法的一种特例&#xff0c;是在已知高斯噪声情况下的贝叶斯最优估计。在ML算法中&#xff0c;观测所得信号…

毅四捕Go设计模式笔记——命令模式

命令模式&#xff08;Command Pattern&#xff09; 为了解决什么问题&#xff1f; 命令模式的目的是将请求发起者和请求执行者解耦&#xff0c;使得请求的发起者不需要知道具体的执行者是谁&#xff0c;也不需要知道执行的具体过程&#xff0c;只需要发送请求即可。 通过使用…

汇丰、Paypal、万事达新动作!全球银行如何构筑量子安全堡垒?

2024年4月22日&#xff0c;欧洲刑警组织更新发文称&#xff0c;其下属欧洲网络犯罪中心&#xff08;EC3&#xff09;与EC3金融服务咨询小组密切合作&#xff0c;创建了量子安全金融论坛&#xff08;QSFF&#xff09;。EC3提供常设秘书处服务&#xff0c;以支持QSFF和指导委员会…

题目 2671: 推导部分和

题目描述: 对于一个长度为 N 的整数数列 A1, A2, AN&#xff0c;小蓝想知道下标 l 到 r 的部分和 是多少&#xff1f; 然而&#xff0c;小蓝并不知道数列中每个数的值是多少&#xff0c;他只知道它的 M 个部分和的值。其中第 i 个部分和是下标 li 到 ri 的部分和 &#xf…

rtl8188ftv debian linux 多架构移植方法

5 块包邮&#xff0c;挂到 x86_64 debian 12 虚拟机&#xff0c;实测下载能到 22Mbps&#xff0c;也可能就2Mbps&#xff0c;上传能到 40Mbps 关键词&#xff1a; rtl8xxxu、rtl8xxxu.ko、rtl8xxxu_8188f.c、mac80211.h、cfg80211.ko、sudo modinfo rtl8xxxu.ko | grep depen…

[Real-Time Spectrum Analyzers (RTSA) ] 实时频谱分析 A

废话&#xff1a; 这部分内容比较多&#xff0c;先写一部分吧&#xff1b; 这个是频谱仪的一部分功能&#xff0c;姑且把仪器制造商分别一流和其他吧&#xff1b; 一流的应该只有两家&#xff0c;Agilent 安捷伦和 R&S罗德与施瓦茨&#xff1b; 一、安捷伦的部分新产品9…

使用 Docker 自建一款怀旧游戏之 - 扫雷

1&#xff09;扫雷 简介 扫雷 是一种经典的单人电脑游戏&#xff0c;最初由微软公司在 1990 年代开发并内置在 Windows 操作系统中。游戏的目标是在一个由方块组成的网格上揭开所有非地雷的方块&#xff0c;而不触发地雷。每个方块上都标有数字&#xff0c;表示周围 8 个方块中…

箭头函数的一些总结

箭头函数,我们常常会用到,那它在使用上和常规函数有什么区别呢?我们来一起看看哈 先来定义一个普通函数,一个箭头函数,分别看一下它们的结构 function abc(){} console.dir(abc)通过查看结构我们知道普通函数有两个原型,一个是作为函数特有的prototype,原型另一个是作为对象…

用Python Turtle画一个中国结

中国结&#xff0c;作为中华民族传统文化的象征之一&#xff0c;以其独特的编织技艺和深厚的文化内涵&#xff0c;深受人们喜爱。今天&#xff0c;我们就来用Python的turtle模块&#xff0c;尝试绘制一个充满韵味的中国结。 我们先来看看整个中国结生成的过程&#xff1a; 中国…

算法学习Day1——【数据结构】单调栈

1.什么是单调栈以及单调栈的作用 &#xff08;1&#xff09;定义 顾名思义&#xff0c;单调栈是一个有序的栈&#xff0c;可能从栈顶到栈底单调递增&#xff08;单调递增栈&#xff09;&#xff0c;也有可能从栈顶到栈底单调递减&#xff08;单调递减栈&#xff09;。 &…