AcWing 1056. !!!股票买卖 III —— 对前后缀分解的理解
原题链接
简单
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int p[N], f[N], b[N];
// 定义三个数组
// 第一个数组用于存储每一天股票的价格
// 第二个数组front 用于存储从 1 ~ i 中售卖股票的最大收益
// 第三个数组behind 用于存储从 i + 1 ~ n 中售卖股票的最大收益
int main(){
int n; // 存入有多少个股票价格
scanf("%d", &n);
for (int i = 1; i <= n; i ++) scanf("%d", &p[i]);
// 存入每个股票价格
// 第一天的收益为0
// 从前往后遍历,不断寻找minv,并更新1 ~ i 天中的最大收益
for (int i = 2, minv = p[1]; i <= n; i ++){
f[i] = max(f[i - 1], p[i] - minv);
minv = min(minv, p[i]);
}
// 第n天的收入为0
// 从后往前遍历,不断寻找maxv,并更新i + 1 ~ n 天中的最大收益
for (int i = n - 1, maxv = p[n]; i >= 1; i --){
b[i] = max(b[i + 1], maxv - p[i]);
maxv = max(maxv, p[i]);
}
int res = 0;
// 定义一个结果
for (int i = 2; i <= n; i ++)
res = max(res, f[i] + b[i + 1]);
// 此处要将两处衔接起来,不让二者的跨度有所重叠
printf("%d", res);
// 输出结果
return 0;
}