Processing math: 33%
Solutions of Maximum sum subarray 2 - MarisaOJ: Marisa Online Judge

Solutions of Maximum sum subarray 2

Select solution language

Write solution here.


User Avatar hungkm466    Created at    16 likes

Hướng dẫn

Cố định i.
Gọi:

  • pre[i] là tổng lớn nhất trong đoạn [1, i]
  • suf[i] là tổng lớn nhất trong đoạn [i, n]

Đáp án bài toán là: max(pre[i-1] + suf[i], pre[i] + suf[i+1]), 2 ≤ i ≤ n - 1

Code: O(n)

#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int MAXN = 1e5 + 5;
int n;
ll a[MAXN], pre[MAXN], suf[MAXN];
ll sum;

#define FOR(i,a,b)  for(int i=a; i<=b; ++i)
#define FORD(i,a,b) for(int i=a; i>=b; --i)

bool maximize(ll &a, const ll &b)
{
    return (a < b) ? a = b, 1 : 0;
}

signed main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);

    cin >> n;
    FOR(i,0,n+1) pre[i] = suf[i] = LLONG_MIN;

    sum = 0;
    FOR(i,1,n) 
    {
        cin >> a[i];
        sum += a[i];
        maximize(pre[i], pre[i-1]);
        maximize(pre[i], sum);
        maximize(sum, 0);
    }

    sum = 0;
    ll ans = LLONG_MIN;
    FORD(i,n,1)
    {
        sum += a[i];
        maximize(suf[i], suf[i+1]);
        maximize(suf[i], sum);
        maximize(sum, 0);

        if (i-1 >= 1) maximize(ans, pre[i-1] + suf[i]);
        if (i+1 <= n) maximize(ans, pre[i] + suf[i+1]);
    }

    cout << ans;
    return 0;
}