| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:大神帮忙看看 超时了In Reply To:大神帮忙看看 超时了 Posted by:268123lry at 2015-01-30 18:52:05 > #include<iostream>
> #include<cstdio>
> #define max 50000
> using namespace std;
> int maxsum(int *a,int head,int tail)
> {
> int sum=-999999;
> int b=0;
> for(int i=head;i<=tail;i++)
> {
> if(b>0) b+=a[i];
> else b=a[i];
> if(b>sum) sum=b;
> }
> return sum;
> }
> int main()
> {
> int n;
> int T;
> int a[max+1];
> scanf("%d",&T);
> while(T--)
> {
> scanf("%d",&n);
> for(int i=1;i<=n;i++)
> scanf("%d",a+i);
> int sum=-999999999;
> int result;
> for(int i=1;i<=n;i++)
> {
> result=maxsum(a,1,i)+maxsum(a,i+1,n);
> if(result>=sum)
> {
> sum=result;
> }
> }
> printf("%d\n",sum);
> }
> }先对数字串从左向右依次求出每段的连续子序列的最大字段和,并将其存入数组array[i]中(i为对应位置),再从右向左用同样的方法求一次最大字段和,并将每个子段i~n的和与对应的另一半1~i-1相加,求出最大值。也就是对每个位置i来说,求出[1~i-1]的最大子段和以及[i~n]的最大子段和,再相加起来,求最大的一个就行了。
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator