AcWing 1058. 股票买卖 V
原题链接
中等
作者:
魔仙哥
,
2024-10-10 14:03:07
,
所有人可见
,
阅读 1
不一样的状态设计
#include<bits/stdc++.h>
using namespace std;
#define F(i,a,b) for(int i=a;i<=b;i++)
const int N = 1e5+5;
int n,a[N],f[N][4];
/*
f[i][0]:没有股票--没卖
f[i][1]:没有股票--卖了
f[i][2]:有股票--没买
f[i][3]:有股票--买了
f[i][0] = max(f[i-1][0],f[i-1][1]);
f[i][1] = max(f[i-1][2],f[i-1][3])+a[i];
f[i][2] = max(f[i-1][2],f[i-1][3]);
f[i][3] = max(f[i-1][0],f[i-2][1])-a[i];
*/
int main()
{
memset(f,-0x3f,sizeof f);
f[0][0] = 0;
cin>>n;
F(i,1,n) cin>>a[i];
F(i,1,n)
{
f[i][0] = max(f[i-1][0],f[i-1][1]);
f[i][1] = max(f[i-1][2],f[i-1][3])+a[i];
f[i][2] = max(f[i-1][2],f[i-1][3]);
f[i][3] = f[i-1][0]-a[i];
if(i >= 2) f[i][3] = max(f[i][3],f[i-2][1]-a[i]);
}
cout << max(max(f[n][0],f[n][1]),max(f[n][2],f[n][3])) << '\n';
return 0;
}