| ||||||||||
| 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 | |||||||||
自习看了网上搜到的思路 折服了 折服了In Reply To:调了半天 都不知道为什么会超时 要郁闷了 牛人帮我看看吧~ 谢谢了:) Posted by:kakassi at 2009-08-07 16:46:37 > #include <iostream>
> using namespace std;
>
> int s[50000];
> int mss(int l,int r){
> int i,j;
> int max = s[l];
> // int imax = l;
> for(i=l;i<=r;i++){
> if(s[i]>max){ //找到从l到i的最大值
> max=s[i];
> // imax = i;
> }
> if(max>0) //如果某次max>0 也就是找到了第一个正数 那么break出来,而且这个正数必为s[i]
> break;
> }
> if(i==r+1) //如果遍历完整个l到r,则证明从来没有正数的存在 那么 最大和就是最大的那个正数
> return max;
> //如果存在正数s[i] 那么必在i处break出来 我们就要从i处开始游标法
>
> int maxsum = s[i];
> int sum = s[i];
> for(j=i+1;j<=r;j++){
> sum+=s[j];
> if(sum>maxsum)
> maxsum = sum;
> if(sum <= 0){
> i = j+1;
> sum = 0;
> }
> }
> return maxsum;
> }
> int main(int argc, char* argv[])
> {
> int T,n;
> int i;
> cin >> T;
> while(T--){
> int ans =0;
> int maxans;
> cin >> n;
> for(i=0;i<n;i++)
> scanf("%d",&s[i]);
> // cin >> s[i];
> maxans = mss(0,0)+mss(1,n-1);
> // cout << maxans << endl;
> for(i=1;i<n-1;i++){
> ans = mss(0,i)+mss(i+1,n-1);
> if (ans>maxans)
> maxans = ans;
> // cout << ans<< " "<< mss(0,i)<<" "<< mss(i,n-1)<< endl;
> }
> cout << maxans << endl;
> }
> system("pause");
> return 0;
> }
>
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator