AT2273 [ARC066C] Addition and Subtraction Hard
https://www.luogu.com.cn/problem/AT2273
首先发现
- 加号后面肯定是不用加括号的
- 括号最多嵌套两层(根据符号调整可以容易证明)
然后就可以DP啦
code:
#include<bits/stdc++.h>
#define N 200050
#define ll long long
using namespace std;
inline int read() {
int x = 0, f = 1; char ch = getchar();
while(ch < '0' || ch > '9') {
if(ch == '-') f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9') x = (x << 3) + (x << 1) + (ch - '0'), ch = getchar();
return f * x;
}
int n;
ll f[N][4];
int main() {
n = read();
f[0][0] = 0; f[0][1] = f[0][2] = - (1e15);
for(int i = 1; i <= n; i ++) {
int x = read(); //printf("%d ", x);
f[i][0] = max(f[i - 1][0], f[i - 1][1]);
f[i][1] = max(f[i - 1][1], f[i - 1][2]);
f[i][2] = f[i - 1][2];
f[i][0] += x, f[i][1] -= x, f[i][2] += x;
if(x < 0) {
f[i][2] = max(f[i][2], f[i][1]);
f[i][1] = max(f[i][1], f[i][0]);
}
}
printf("%lld", max(f[n][0], max(f[n][1], f[n][2])));
return 0;
}