CF33C Wonderful Randomized Sum(数学推导+最大子序列和)

洛谷评测地址:https://www.luogu.com.cn/problem/CF33C

前后缀,可重合。

设前缀非重合部分为A,重合部分C,后缀非重合部分为B,总和为S

那么有:

A+B+C==S;

令-(A+B)+C最大。

变形得:

2*C-S。S固定,C最大即可,即求最大子序列和。

PS:想不出来的时候,不妨写写式子,对式子进行变形,也许会有额外收获!

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e5 + 95;
const int inf=999999999;
int a[maxn];
int b[maxn];
int sl[maxn],sr[maxn];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    int sum=0;
    int summax=0;
    int maxx=-inf;
    for(int i=1;i<=n;i++)
    {
        sum+=a[i];
        summax+=a[i];
        if(summax<0)  //小于0,上段就省去。只要>=0的部分。
            summax=0;
        maxx=max(maxx,summax);
    }
    cout<<maxx*2-sum<<endl;
}
posted @ 2020-10-21 20:36  liyexin  阅读(108)  评论(0编辑  收藏  举报