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

news/2024/10/18 6:23:43/

目录

股票买卖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.ppmy.cn/news/187361.html

相关文章

android+p+华为手机,小米之后 华为与荣耀多款手机开启Android P内测

原标题&#xff1a;小米之后 华为与荣耀多款手机开启Android P内测 集微网消息(文/罗明)昨天我们报道了在谷歌发布Android P正式版之后&#xff0c;国内手机厂商小米率先开启Android P的内测&#xff0c;目前已知的机型仅限小米MIX2S&#xff0c;同为竞争对手的华为自然不会无动…

一加6 android p测试,一加6更新Android P有什么新功能 目前仍有这些问题

8月7日&#xff0c;谷歌正式推送第九个Android大版本&#xff0c;也就是Android P&#xff0c;拥有全新的操作手势和界面。之前小米MIX 2S已经能升级到基于Android P的MIUI 10 8.8.7内测版&#xff0c;成为国内首款升级到Android P的手机。   8月14日深夜&#xff0c;一加官方…

一加6 android p测试,一加发布Android P公测版 一加手机6可升级

Android P正式版已经发布&#xff0c;国内手机厂商也开始了测试阶段&#xff0c;其中&#xff0c;一加手机今日公布消息&#xff0c;已经为旗下的一加手机6提供了Android P公测版升级。 【PChome手机频道资讯报道】Android P正式版已经发布&#xff0c;国内手机厂商也开始了测试…

小米6 android p是什么,小米6什么配置参数?小米6标配有什么?

小米6什么配置参数 小米6的配置参数是配备5.15英寸1080P显示屏&#xff0c;4搭载满血版的高通骁龙835处理器&#xff0c;以及配备6GB运行内存。此外&#xff0c;小米6跟进了双摄的设计&#xff0c;配备“广角长焦”的双摄像头。版本方面&#xff0c;小米6提供了三个版本&#x…

荣耀v8 android os,华为荣耀V8的手机系统是什么

华为荣耀V8的手机系统是什么 华为荣耀V8的手机系统是Android 6.0。 摄像头方面&#xff0c;华为荣耀V8前置800W像素自拍镜头&#xff0c;拥有F2.4光圈&#xff0c;后置两颗平行设计的1200W像素摄像头&#xff0c;一颗黑白一颗彩色&#xff0c;黑白镜头可以加强细节表现力&#…

题目:P5638 【CSGRound2】光骓者的荣耀

题目&#xff1a;【CSGRound2】光骓者的荣耀 - 洛谷 题目大意 用最少时间要将所有城市全部访问完&#xff0c;若有传送器可使用传送器。 坑点 1.需要考虑传送器数量与城市的数量 &#xff0c;若传送器大于城市输出0 2.需要考虑数据范围较大&#xff0c;long long int 数据范围…

华为荣耀20s云服务_荣耀20s参数

展开全部 荣耀211320pro参数&#xff1a; 1、屏幕规5261格&#xff1a;6&#xff0e;26英寸1080PLCD魅眼全面屏。4102 2、机身颜色&#xff1a;幻影1653蓝、幻夜黑、冰zhi岛白内、蓝水翡翠和容幻夜星河(dao四曲面3D玻璃机身)。 3、处理器&#xff1a;麒麟980处理器。 4、操作系…

荣耀6plus android6.0,荣耀6PLUS升级安卓6.0(emui4.0)感受

我的手机是荣耀6PLUS&#xff0c;是16年2月买&#xff0c;当时降价200&#xff0c;卖1399.只所以选他&#xff0c;感觉主要配置同Mate7&#xff0c;考虑到自己连密码都不设&#xff0c;又便宜700&#xff0c;所以就买了它。当时它的系统是B133。买了之后&#xff0c;双卡使用&a…