我这一段时间,刷的题都来源于y总的算法提高课,等把提高课过完一遍后,会继续更新力扣的每日一题
题目链接
活动 - AcWing 本课程系统讲解常用算法与数据结构的应用方式与技巧。https://www.acwing.com/problem/content/1060/今天是状态机的第三讲,股票买卖Ⅴ,对题目进行分析,本题相较于昨天的股票买卖Ⅳ,没有了交易次数的限制,而是一个冷静期的状态,所以这道题,我们则使用f[ i ][ 3 ]这个容器来进行交易利润的状态转移,0是手上没有且没进冷静期,1是手上有票,2是手上没票进入冷静期,状态转移为
f[i][0]=max(f[i-1][0],f[i-1][2]);
f[i][1]=max(f[i-1][1],f[i-1][0]-w[i]);
f[i][2]=max(f[i-1][2],f[i-1][1]+w[i]);
ac代码为
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int f[N][3];//0是手上没有且没进冷静期,1是手上有票,2是手上没票进入冷静期
int w[N];
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>w[i];
memset(f,-0x3f3f3f,sizeof f);
for(int i=0;i<=n;i++)f[i][0]=f[i][2]=0;
for(int i=1;i<=n;i++){
f[i][0]=max(f[i-1][0],f[i-1][2]);
f[i][1]=max(f[i-1][1],f[i-1][0]-w[i]);
f[i][2]=max(f[i-1][2],f[i-1][1]+w[i]);
}
cout<<max(f[n][0],f[n][2]);
}