最大和

问题描述】
n个数围成一圈,要求从中选择若干个连续的数(注意每个数最多只能选一次)加起来,问能
形成的最大的和。
【输入】
输入文件为input.txt。
第一行输入n,表示数字的个数。
第二行输入这n个数字。
【输出】
输出文件为output.txt 。
共1行,为最大和。
【输入输出样例】
input.txt
8
2 -4 6 -1 -4 8 -1 3
output.txt
14
【数据范围】
对于40%的数据,1 ≤ n ≤ 300;
对于60%的数据,1 ≤ n ≤ 2000;
对于100%的数据,1 ≤ n ≤ 100000,答案在int(pascal 是longint)范围内。

分两种情况,

1.所求得的答案区间没有绕出一个环(单向,不绕过1),这种情况下就是求两个前缀和的差的最大值

2.所求的答案区间绕出了一个环(例如8->2即8->1->2),这种情况下考虑的是(后缀和+前缀和最大值)的最大值

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<algorithm>
 7 #define maxn 100000+5
 8 #define chushi 21000000
 9 #define inf 0x7fffffff
10 using namespace std;
11 int sum1[maxn]={0},sum2[maxn]={0},a[maxn],maxx,minn,maxxx;
12 int main()
13 {
14     freopen("input.txt","r",stdin);
15     freopen("output.txt","w",stdout);
16     int n;
17     scanf("%d",&n);
18     for(int i=1;i<=n;++i) scanf("%d",&a[i]);
19     sum1[1]=a[1];
20     for(int i=2;i<=n;++i) sum1[i]=sum1[i-1]+a[i];
21     sum2[n]=a[n];
22     for(int i=n-1;i>=1;--i) sum2[i]=sum2[i+1]+a[i];
23     maxx=-chushi;minn=chushi;
24     //所求区间没有绕出环 ,求两前缀和之差的最大值 
25     for(int i=1;i<=n;++i)
26      {
27          if(sum1[i]-minn>maxx) maxx=sum1[i]-minn;
28          if(sum1[i]<minn) minn=sum1[i];
29      }
30      //所求区间绕出了一个环,(后缀和+前缀最大值)的最大值 
31      maxxx=-chushi;
32      for(int i=1;i<=n;++i)
33       {
34            if(sum2[i]+maxxx>maxx) maxx=maxxx+sum2[i];
35            if(sum1[i]>maxxx) maxxx=sum1[i];
36       }
37       cout<<maxx;
38       return 0;
39 }
40     
View Code

 

posted @ 2015-11-01 19:06  Maydaytyh  阅读(330)  评论(1编辑  收藏  举报