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;
}
posted @ 2021-09-13 20:59  lahlah  阅读(41)  评论(0编辑  收藏  举报