0. 前言
以前写的垃圾博文… [Hdp] lc188. 买卖股票的最佳时机 IV(状态机模型dp+线性dp+空间优化)。
强相关:
1. 状态机模型
思路:
注意:
- 初始化由状态定义,状态机定义而定
- 答案,要取
max(f[n][1],f[n][2])
,不能只输出:f[n][1]
,若股票单调下降,则一次都不买。则一直在状态 2 一直自转,就不会到达状态 1。但只要有买股票,那么这两个状态都是可以输出的 (个人理解)
代码:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1e5+5, INF = 0x3f3f3f3f;
int n;
int a[N];
int f[N][3];
int main() {
cin >> n;
for (int i = 1; i <= n; ++i) cin >> a[i];
f[0][0] = f[0][1] = -INF;
f[0][2] = 0;
for (int i = 1; i <= n; ++i) {
f[i][0] = max(f[i - 1][0], f[i - 1][2] - a[i]);
f[i][1] = f[i - 1][0] + a[i];
f[i][2] = max(f[i - 1][2], f[i - 1][1]);
}
cout << max(f[n][1], f[n][2]) << endl;
return 0;
}