洛谷评测地址: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; }