标签:
问题描述】
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
标签:
原文地址:http://www.cnblogs.com/TYH-TYH/p/4928415.html