51nod 1050 循环数组最大子段和(基础dp)

来源:互联网 发布:人工智能猜出眉毛 编辑:程序博客网 时间:2024/06/13 08:58

刚开始还以为把数组复制一份接在后边求最大子段和呢,结果wa。。。然后就想了想两重循环,看数据量这样肯定会超时。。就去看看讨论版,思路很简单,可是想不到啊。。。
摘自讨论版:
答案有两种形式1.正常的最大连续序列2.开始在尾,结束的首第一种正常求,第二种考虑答案的组成,开始的一段+到结尾的一段,那么中间为什么去掉呢,因为中间那段和为负数,只要求出负数最大的子段和去掉就行了max(ans1,sum+ans2);

#include <iostream>#include <algorithm>#include <cstdio>using namespace std;typedef long long ll;const int MAXN = 50010;ll num;int main(){    //freopen("in","r",stdin);    int n;    cin >> n;    ll total = 0;    ll sum1=0;    ll sum2=0;    ll minn = 1e9;    ll maxn = -1e9;    for(int i = 0; i < n; ++i)    {        cin >> num;        total += num;        sum1 += num;        sum2 += num;        if(sum1 < 0)            sum1 = 0;        if(sum2 > 0)            sum2 = 0;        if(sum1 > maxn)            maxn = sum1;        if(sum2 < minn)            minn = sum2;    }    cout << max(maxn,total-minn) <<endl;    return 0;}
0 0
原创粉丝点击