简单记录,请看注释!
y总的状态机模型图:从左到右依次为状态1、2、3
- 入口:第0天,并且一定可以买货,因此入口一定是指向状态2的!对应初始化
f[0][2] = 0
- 出口:一定是无货状态,因此可以为状态1和状态2!对应初始化
f[0][0] = f[0][1] = 负无穷
参考代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int f[N][3], n, w[N];
/*
状态表示:f[i][j]表示从前i天选,且当前状态为j的集合!的最大值!
状态j: 0 -> 手中有货
1 -> 手中第一天没货
2 -> 手中 >= 2天没货
状态计算:
f[i][0] = max(f[i - 1][0], f[i - 1][2] - w[i])
f[i][1] = f[i - 1][0] + w[i]
f[i][2] = max(f[i - 1][1], f[i - 1][2])
初始化:f[0][0] = f[0][1] = 负无穷(不可能,初始化为负无穷)
f[0][2] = 0
*/
int main(){
cin >> n;
for(int i = 1; i <= n; i ++) cin >> w[i];
f[0][0] = f[0][1] = -0x3f3f3f3f, f[0][2] = 0;
for(int i = 1; i <= n; i ++){
f[i][0] = max(f[i - 1][0], f[i - 1][2] - w[i]);
f[i][1] = f[i - 1][0] + w[i];
f[i][2] = max(f[i - 1][1], f[i - 1][2]);
}
cout << max(f[n][1], f[n][2]) << endl;
return 0;
}