题目链接:HAUTOJ 1282
题意:求最大子段和的套路题,不过稍微变形了一点(变了一点点我就不会了 5555),就是构成了一个回环,需要加上首尾相连的情况,这时候我们可以用子段总和减去最小子段和,就是最大的子段和情况,题解思路是求相反子段和的最大子段和,最后用最大子段总和加上相反子段的最大子段和,其实和原来的那种思路一样,不过这种思路有局限性,就是只适合有正有负的情况,如果全部为正,则不能够满足条件 #include<stdio.h> #include<algorithm> #include<stdlib.h> using namespace std; #define N 55000 #define inf -99999999 int a[N],b[N]; long long Max(long long a,long long b) { if(a>b) return a; return b; } int main() { int i,n; long long sum,sum1,sum2,ans; while(scanf("%d",&n)!=EOF) { ans = inf; sum = 0; sum1 = sum2 = 0; for(i = 1; i <= n; i ++) { scanf("%d",&a[i]); b[i] = -a[i]; sum += a[i]; } for(i = 1; i <= n; i ++) { sum1 += a[i]; sum2 += b[i]; if(sum1 < 0) sum1 = 0; if(sum2 < 0) sum2 = 0; ans = Max(ans,sum1); ans = Max(ans,sum+sum2); } printf("%lld\n",ans); } return 0; }