1007 Maximum Subsequence Sum

一开始以为用前缀和做,看了下数据10000,果断放弃。

思考了一下,最大和序列的第一个数必为正数(废话),关键是从头开始的子序列和也必为正数。如果加到某个地方和为负数,我还要你前面这些数何用,不如从后面开始重新选。基于上述思路就可以写出代码了。

#include <iostream>
#include <cstring>
#include <string>
#include <sstream>
#include <string>
#include <cstdio>
#include <algorithm>
#include <vector>
#define maxn 10005
#define INF 0x3f3f3f3f
#define EPS 1e-6
#define pi acos(-1.0)
using namespace std;
typedef long long ll;
int n;
int a[maxn];

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    int flag;
    for(flag=1;flag<=n;flag++)
    {
        if(a[flag]>=0)
            break;
    }
    if(flag==n+1)
    {
        cout<<0<<" "<<a[1]<<" "<<a[n]<<endl;
        return 0;
    }
    int maxx=-1;
    int sum=0;
    int s,t,tmp=1;
    for(int i=1;i<=n;i++)
    {
        sum+=a[i];
        if(sum>maxx)
        {
            maxx=sum;
            s=tmp;
            t=i;
        }
        else if(sum<0)
        {
            sum=0;
            tmp=i+1;
        }
    }
    cout<<maxx<<" "<<a[s]<<" "<<a[t]<<endl;
    return 0;
}
View Code

 

posted on 2018-11-30 22:45  FTA_Macro  阅读(119)  评论(0编辑  收藏  举报

导航