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

news2024/11/17 9:46:51

目录

股票买卖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)来作为两种状态 

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

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

相关文章

1. Mysql InnoDB中的索引

一、InnoDB中的索引 InnoDB存储引擎支持以下几种常见的索引&#xff1a;B树索引、全文索引、哈希索引&#xff0c;其中比较关键的是B树索引。 1. B树索引介绍 InnoDB中的索引自然也是按照B树来组织的&#xff0c;前面我们说过B树的叶子节点是用来放数据的。但是放什么数据呢…

攻防世界-基础android

下载链接&#xff1a;下载 参考链接&#xff1a;攻防世界-Mobile-基础android (Misc经验解法&#xff09;_攻防世界基础android_Q_yt的博客-CSDN博客 方法一&#xff1a; 这是个偏向Misc的解题思路&#xff0c;下载完是个apk文件&#xff0c;载入010 Editor看一下&#xff0…

京东工作8年,肝到T8就剩这份心得了,已助朋友拿到10个Offer

在京东工作了8年&#xff0c;工作压力大&#xff0c;节奏快&#xff0c;但是从技术上确实得到了成长&#xff0c;尤其是当你维护与大促相关的系统的时候&#xff0c;熬到T7也费了不少心思&#xff0c;小编也是个爱学习的人&#xff0c;把这几年的工作经验整理成了一份完整的笔记…

TiDB亿级数据亚秒响应查询方案介绍

目录 1 什么是TiDB2 什么是NewSQL2.1 传统SQL的问题2.1.1 升级服务器硬件2.1.2 数据分片 2.2 NoSQL 的问题2.2.1 优点2.2.2 缺点 2.3 NewSQL 特性2.3.1 NewSQL 的主要特性&#xff1a;2.4 三种SQL的对比 3 TiDB怎么来的3.1 TiDB社区版和企业版 4 TIDB核心特性4.1 水平弹性扩展4…

【JUnit技术专题】「入门到精通系列」手把手+零基础带你玩转单元测试,让你的代码更加“强壮”(核心API篇)

手把手零基础带你玩转单元测试&#xff0c;让你的代码更加“强壮”&#xff08;核心API篇&#xff09; JUnit 中的重要的 APIAssert 类TestCase 类TestResult 类TestSuite 类 JUnit 中的重要的 API JUnit 中的最重要的程序包是 junit.framework 它包含了所有的核心类。一些重要…

数字孪生:数字世界与现实世界的交汇

数字孪生是一种崭新的技术,指将现实世界中的物理实体、系统或过程通过数字化技术在虚拟数字世界中建立起虚拟模型。数字孪生可以帮助人们以更小的成本地理解和预测现实世界中的物理实体、系统或过程的行为和性能,从而提高生产效率、降低成本、减少风险等。 如今数字孪生技术…

Makerbase SimpleFOC ESP32 例程1 双电机开环速度测试

Makerbase SimpleFOC ESP32 例程1 双电机开环速度测试 第一部分 硬件介绍 1.1 硬件清单 序号品名数量1ESP32 FOC V1.0 主板12YT2804电机2312V电源适配器14USB 线1 注意&#xff1a;YT2804是改装的云台无刷电机,带有AS5600编码器&#xff0c;可实现360连续运转。 主要参数如…

刷题记录:双指针 | leetcode-1156. 单字符重复子串的最大长度 2023/6/3

1156. 单字符重复子串的最大长度 感觉这道题&#xff0c;双指针的思路很好想&#xff0c;但是要直接实现&#xff0c;对我而言还是有一些磕磕绊绊&#xff08;还是题做少了qaq&#xff09;。 思路是这样的&#xff0c;比如字符串序列为&#xff1a; aaabaaaba 那么一开始&am…

【leetcode】1156. 单字符重复子串的最大长度

1156. 单字符重复子串的最大长度 问题描述问题分析解决方案 问题描述 1156. 单字符重复子串的最大长度 如果字符串中的所有字符都相同&#xff0c;那么这个字符串是单字符重复的字符串。 给你一个字符串 text&#xff0c;你只能交换其中两个字符一次或者什么都不做&#xff…

基于AT89C52单片机的液晶多功能电子台历设计

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87858426 源码获取 第5章 液晶多功能电子台历的设计 5.1 功能要求 该项目以单片机STC89C54为核心,结合单线数字温度传感器DS18B20、时钟芯片DS1302和液晶显示器12864设计而…

GPU推理和端侧NPU推理的一处不同

端侧AI推理主要使用NPU完成,为了在性能,功耗和面积和通用性之间取得平衡,主流NPU采用了加速器架构,将算子固化在硬件中,并辅以可编程单元执行一些自定义算子/长尾算子兼顾灵活性。在计算方面,为了提高存储使用效率和加速计算,在满足计算精度的前提下,NPU普遍采用定点计…

编程的未来 - 还有未来么?

缘起 唐门教主上个月某天深夜写了一篇博客 --《编程的未来》&#xff0c;要我谈谈感想。 这也是最近软件工程师们聊得比较多的问题&#xff0c;上周&#xff0c;在上海的 “关东小磨” 和十多位 CSDN 博主聚会的时候&#xff0c;大家也稍微谈了一下这个话题&#xff0c;但是谈…

一哥们从小厂逆袭,涨薪50%,真是麻雀啄了牛屁股,雀食牛逼啊

前言 大多数情况下&#xff0c;软件测试人员的个人技能成长速度&#xff0c;远远大于公司规模或业务的成长速度。所以&#xff0c;跳槽成为了这个行业里最常见的一个词汇。 实际上&#xff0c;跳槽的目的无非是为了涨薪或是职业发展&#xff0c;我也不例外。普通本科毕业后&a…

vscode课程学习分析选课作业系统nodejs+vue

软件体系结构方案&#xff1a;由于本系统需要在不同设备上都能运行&#xff0c;而且电脑配置要求也要越低越好&#xff0c;为了实现这一要求&#xff0c;经过考虑B/S结构成为最佳之选。使用B/S结构的系统可以几乎在任何电脑上运行&#xff0c;只要浏览器可以正常工作就可以正常…

操作系统复习5.1.0-I/O管理

分类 按使用特性分 人机交互类&#xff1a;键盘、鼠标、打印机 存储设备&#xff1a;移动硬盘、光盘 网络通信设备&#xff1a;调制解调器 按速率分 低速设备&#xff1a;键鼠 中速设备&#xff1a;打印机 高速设备&#xff1a;磁盘 按信息交换单位分 块设备&#xff1a;…

yum和vim【Linux操作系统】

Linux软件包管理器 yum Linux安装软件&#xff1a; 源代码安装&#xff08;下载到程序的源代码&#xff0c;进行编译&#xff0c;得到可执行程序&#xff0c;太麻烦&#xff0c;因此有些人会将有些常用的软件提前编写好&#xff0c;做成软件包&#xff09; rpm安装&#xff08;…

BCD格式及与十进制/十六进制的转换

本文框架 前言1. BCD码是什么&#xff1f;2. 不同进制与BCD码之间的转换2.1 十进制与BCD码的转换2.1.1 十进制转换为BCD码2.1.2 BCD码转换为十进制 2.2 十六进制与BCD码的转换 前言 在诊断快照开发中会遇到保存年月日等使用BCD码格式的需求&#xff0c;本篇我们就一起看一下BC…

Sentinel监控微服务_流量控制_熔断降级_系统规则讲解

Sentinel 监控微服务 需求分析/图解 需求: 使用Sentinel 控制台对member-service-nacos-provider-10004 微服务进行实时监控 示意图 当调用了member-service-nacos-provider-10004 微服务时, 可以监控到请求的url/QPS/响应时间/流量 代码/配置实现 修改member-service-nac…

Redis之SDS数据结构的使用

目录 序言字符串 char*字符串数组简单动态字符串SDS 序言 Redis的几种基本数据结构有字符串&#xff08;String&#xff09;、哈希&#xff08;Hash&#xff09;、列表&#xff08;List&#xff09;、集合&#xff08;Set&#xff09;、有序集合&#xff08;Sorted Set&…

美国原装二手KEYSIGHT N8975A是德N8975B噪声系数分析仪

KEYSIGHT / AGILENT N8975A N8975B 噪声系数分析仪 Keysight N8975B 高性能噪声系数分析仪旨在进行快速、准确和可重复的噪声系数测量。它有一个多点触控界面&#xff0c;允许拉伸、捏合和拖动手势。大多数菜单都可以通过手指轻点来访问&#xff0c;而无需切换屏幕。通过允许…