循环数组最大子段和
题目链接:51Nod - 1050题意:就是题目, 循环数组最大子段和;
如果不加循环二字吗妥妥的DP做出来了, 异常的简单;加上循环二字就难办了;以每个数为起点跑一遍最大子段和???
O(n^2)的复杂度, 算了, 这样死死的过不了;
换个角度想, 可不可以求个最小子段和?嗯, 这个很好求, 和最大一样;有用吗?, 有用!
数组和减去最小子段和不就是循环的时候的最大子段和吗?没错就是这样的;
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> using namespace std; const int maxn=100100; long long a[maxn], n, minn, maxx, sum, x, y; int main(){ while(~scanf("%lld", &n)){ for(int i=0; i<n; i++){ scanf("%lld", &a[i]); } sum=x=y=0LL; for(int i=0; i<n; i++){ if(i==0){ maxx=max(0LL, a[i]); minn=min(0LL, a[i]); } else{ maxx=max(maxx+a[i], 0LL); minn=min(a[i]+minn, 0LL); } y=max(y, maxx); x=min(x, minn); sum+=a[i]; } long long ans=max(y, sum-x); printf("%lld\n", ans); } return 0; }