股票买卖篇(II,III,IV)--基础,详细!状态机简单应用

2024-03-03 23:40

本文主要是介绍股票买卖篇(II,III,IV)--基础,详细!状态机简单应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

股票买卖II

 本题思路

关于异常值的解释 

代码 

 股票买卖III

 本题思路 (包括对交易过程的理解,需认真理解)

代码

股票买卖 IV 

本题思路 

 代码


股票买卖II

 输入样例

6
7 1 5 3 6 4

输出样例

7

输入样例 

5
1 2 3 4 5

输出样例 

4

 本题思路

该题是最简单的一道题

从两个状态入手

0:在第i天手中没有股票

1:在第i天手中拥有股票

状态方程

①:f[i][0]=max(f[i-1][0],f[i-1][1]+a)

一个一个解释:

f[i][0]:在第i天手中没有股票的情况

f[i-1][0]:在第i-1天其实都没有

f[i-1][1]+a:在第i-1天拥有股票,说明是在第i天卖出了,所以要加上第i天股票的价格a

②:f[i][1]=max(f[i-1][1],f[i-1][0]-a)

一个一个解释:

f[i][1]:在第i天手中拥有股票的情况

f[i-1][1]:在第i-1天其实都有

f[i-1][0]-a:在第i-1天其实没有股票,说明是在第i天买入了,所以要减去第i天股票的价格a

关于异常值的解释 

由于要用到"i-1",这种(一般都需要特殊处理),会出现f[0][1]这样尴尬的现象

就相当于你没有物品,何谈拥有,亦或者,你都没有对象,何谈分手??🐕🐕

所以现在就要对其进行特殊的赋值,由于要算最大值,呢就赋值无穷小,怎么也不会被选中

代码 

// 两种情况
// 1.第i天手中是否有股票(0:没有,1:有)
// f[i][0]=max(f[i-1][0],f[i-1][1]+a)
// f[i][1]=max(f[i-1][1],f[i-1][0]-a)#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int f[N][2];
int n;int main()
{cin>>n;f[0][1]=-0x3f3f3f3f;//刚开始以为可以省略,但是//前i-1天不可能出现,f[0][1]的情况(//观察f[i][0]的状态如果这个不特殊处理,第一波就会出错)//但是会出现f[0][0]//而且一共1e5个数大小10000,然后f[0][1]就取4个3f//我第一次取得一个-0x3f,然后在第1000组数据就WA了for(int i=1;i<=n;i++){int a;scanf("%d",&a);f[i][0]=max(f[i-1][0],f[i-1][1]+a);f[i][1]=max(f[i-1][1],f[i-1][0]-a);}cout<<f[n][0];return 0;
}

小插曲:

如果以后特殊值处理情况下,都设成0x3f3f3f3f,这样至少不会出现让你找好久都不知道错哪里的乌龙 

 股票买卖III

输入样例: 

8
3 3 5 0 0 3 1 4

输出样例:

6

输入样例:

5
1 2 3 4 5

输出样例: 

4

 本题思路 (包括对交易过程的理解,需认真理解)

本题在上一题基础上添加了一个条件--只允许两次交易

首先,不着急聊状态,要先明白一个词"交易",什么叫做"交易"?

就是有买,有卖,才算一次交易

要理解,从1-->0,是拥有到没有的过程这是一次交易

0--->1--->0 是第 'j-1' 次交易完后是 '0' 的状态转移到第 'j' 次交易 '1' 的状态再到第 'j' 次交易 '0' 的状态

OK!如果上述过程理解了,就到状态解释了

还是两个状态:0/1(同上)

状态方程

①:f[i][j][0]=max(f[i-1][j][0],f[i-1][j][1]+a)

一个一个解释:

f[i][j][0]:在第i天,进行第j次交易后,手中没有股票

f[i-1][j][0]:在第i-1天,进行第j次交易后,手中已经没有股票,在第i天没有进行交易,保持之前的状态(故:在第i天,仍是第j次交易)

f[i-1][j][1]+a:在第i-1天,进行第j次交易后,手中持有股票(但是这个为什么是j不是j-1呢?上面我说了,1-->0才是一次交易),本次是第j次交易的一半,所以在第i天卖出,加上a,这才是一次完整的交易

②:f[i][j][1]=max(f[i-1][j][1],f[i-1][j-1][0]-a)

f[i][j][1]:在第i天,进行第j次交易后,手中持有股票

f[i-1][j][1]:在第i-1天,进行第j次交易后,手中已经持有股票,在第i天没有进行交易,保持之前的状态

f[i-1][j-1][0]-a:在第i-1天,进行第j-1次交易时,手中卖掉了股票(1-->0这是完整的一次交易,故下次交易就是第j次,所以本次是第j次交易的开始,开始买入要减去本次的价格

好了话不多说

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int f[N][3][2];
int n;int main()
{cin>>n;memset(f,-0x3f3f3f3f,sizeof f);f[0][0][0]=0;for(int i=1;i<=n;i++){int a;scanf("%d",&a);f[i][0][0]=0;for(int k=1;k<=2;k++){f[i][k][0]=max(f[i-1][k][0],f[i-1][k][1]+a);f[i][k][1]=max(f[i-1][k][1],f[i-1][k-1][0]-a);}}int ma = -0x3f3f3f3f;for(int k = 0; k <= 2; k++){ma = max(ma, f[n][k][0]);}cout<<ma;return 0;
}

这里要说一点,为什么全都开始设为异常值了,开始我还是把最特殊的f[0][0][1]一个设置了异常处理,但是我发现不对,我看完别人的我发现,你一个交易是先1(买入)再(0),呢么你f[0][1][0],f[1][0][1]······要异常处理的太多了,不只是一个了,呢索性就都进行异常处理,然后把合理的置为0,f[0][0][0],f[1][0][0]·······都是合理的至为0

还有一个乌龙,我可能基础没学好我刚开始设置f[N][2][2],我以为就两次交易,的但是WA了,然后可能要存三个?迷迷,反正开三个对了,以后抽空研究一下,应该是存了“0,1,2”,所以开三个,以后都尽量开大一点,这种错磨人得很            

股票买卖 IV 

输入样例:

3 2
2 4 1

输出样例:

2

输入样例:

6 2
3 2 6 5 0 3

输出样例:

7

本题思路 

好吧,其实本题思路和上一个一模一样,就一点不一样,上一个是进行2次交易,本题是进行k次,就代码改一点进行,不懂私信我,或者什么的都行🙂🙂

 代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int f[N][110][3];int main()
{int n,k;cin>>n>>k;memset(f,-0x3f3f3f3f,sizeof f);f[0][0][0]=0;for(int i=1;i<=n;i++){int a;scanf("%d",&a);f[i][0][0]=0;for(int j=1;j<=k;j++){f[i][j][0]=max(f[i-1][j][0],f[i-1][j][1]+a);f[i][j][1]=max(f[i-1][j][1],f[i-1][j-1][0]-a);}}int ma=-0x3f3f3f3f;for(int j=0;j<=k;j++){ma=max(ma,f[n][j][0]);}cout<<ma;return 0;
}

好啦,总结一波,具体就是DP的子级,比DP要多考虑一个东西,就是状态,股票就是,是否持有股票(0/1)来作为两种状态 

这篇关于股票买卖篇(II,III,IV)--基础,详细!状态机简单应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/771307

相关文章

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

如何为Yarn配置国内源的详细教程

《如何为Yarn配置国内源的详细教程》在使用Yarn进行项目开发时,由于网络原因,直接使用官方源可能会导致下载速度慢或连接失败,配置国内源可以显著提高包的下载速度和稳定性,本文将详细介绍如何为Yarn... 目录一、查询当前使用的镜像源二、设置国内源1. 设置为淘宝镜像源2. 设置为其他国内源三、还原为官方

最详细安装 PostgreSQL方法及常见问题解决

《最详细安装PostgreSQL方法及常见问题解决》:本文主要介绍最详细安装PostgreSQL方法及常见问题解决,介绍了在Windows系统上安装PostgreSQL及Linux系统上安装Po... 目录一、在 Windows 系统上安装 PostgreSQL1. 下载 PostgreSQL 安装包2.

Java中的Lambda表达式及其应用小结

《Java中的Lambda表达式及其应用小结》Java中的Lambda表达式是一项极具创新性的特性,它使得Java代码更加简洁和高效,尤其是在集合操作和并行处理方面,:本文主要介绍Java中的La... 目录前言1. 什么是Lambda表达式?2. Lambda表达式的基本语法例子1:最简单的Lambda表

MySql match against工具详细用法

《MySqlmatchagainst工具详细用法》在MySQL中,MATCH……AGAINST是全文索引(Full-Textindex)的查询语法,它允许你对文本进行高效的全文搜素,支持自然语言搜... 目录一、全文索引的基本概念二、创建全文索引三、自然语言搜索四、布尔搜索五、相关性排序六、全文索引的限制七

python中各种常见文件的读写操作与类型转换详细指南

《python中各种常见文件的读写操作与类型转换详细指南》这篇文章主要为大家详细介绍了python中各种常见文件(txt,xls,csv,sql,二进制文件)的读写操作与类型转换,感兴趣的小伙伴可以跟... 目录1.文件txt读写标准用法1.1写入文件1.2读取文件2. 二进制文件读取3. 大文件读取3.1

Python结合PyWebView库打造跨平台桌面应用

《Python结合PyWebView库打造跨平台桌面应用》随着Web技术的发展,将HTML/CSS/JavaScript与Python结合构建桌面应用成为可能,本文将系统讲解如何使用PyWebView... 目录一、技术原理与优势分析1.1 架构原理1.2 核心优势二、开发环境搭建2.1 安装依赖2.2 验

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效