AcWing 1055. 股票买卖 II
原题链接
简单
作者:
ljhs
,
2021-04-15 15:01:28
,
所有人可见
,
阅读 194
/**
* 状态表示:f[0/1][i] 表示仅考虑前i支股票时,且当前手里有(1)无(0) 股票时的最大收益
*
* 状态计算:
* 每一天要么买股票/卖股票,要么什么不做
* (一)第i天没股票了:
* 1.第i - 1天就没股票。f[0][i - 1]
* 2.第i - 1天有股票,但是在第i天卖出了。 f[1][i - 1] + w[i]
* f[0][i] = max(f[0][i - 1], f[1][i - 1] + w[i]);
* (二)第i天有股票:
* 1.第i - 1天就有股票。f[1][i - 1];
* 2.第i - 1天没股票,但是在第i天买入。f[0][i - 1] - w[i];
* f[1][i] = max(f[1][i - 1], f[0][i - 1] - w[i]);
*/
#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
const int N = 100010;
int n;
LL f[2][N];
int main(){
cin >> n;
memset(f, 0xcf, sizeof(f));
f[0][0]= 0;//考虑前0支股票,且当前未持有股票的最大收益为0.
for(int i = 0; i < n; i++){
int w; cin >> w;
f[0][i] = max(f[0][i - 1], f[1][i - 1] + w);//(一)
f[1][i] = max(f[1][i - 1], f[0][i - 1] - w);//(二)
}
cout << max(f[1][n - 1], f[0][n - 1]) << endl;
return 0;
}