最大和

【题目描述】

N个数围成一圈,要求从中选择若干个连续的数(注意每个数最多只能选一次)加起来,问能形成的最大的和。

【输入描述】

第一行输入N,表示数字的个数,第二行输入这N个数字。

【输出描述】

输出最大和。

【样例输入】

8

2 -4 6 -1 -4 8 -1 3

【样例输出】

14

【数据范围及提示】

1 <= N <= 100000,答案在Longint范围内。

源代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 100000000
using namespace std;
int n,sum(0),i[100001],f[100001],ans=-INF,num=INF;
int main() //当数据皆为负数时,什么都不会选,就是0,我觉得这样应该也对。
{
    scanf("%d",&n);
    for (int a=1;a<=n;a++)
    {
          scanf("%d",&i[a]);
          sum+=i[a]; //总和。
    }
    for (int a=1;a<=n;a++) //1~n链状时的最大值。
    {
        if (f[a-1]>0)
          f[a]=f[a-1]+i[a];
        else
          f[a]=i[a];
        ans=max(ans,f[a]);
    }
    memset(f,0,sizeof(f)); //别忘记初始化。
    for(int a=1;a<=n;a++) //环状(区间在两端)时的最大值。
    {
        if (f[a-1]<0)
          f[a]=f[a-1]+i[a];
        else
          f[a]=i[a];
        num=min(num,f[a]);
    }
    ans=max(ans,sum-num); //取其优。
    printf("%d",ans);
    return 0;
}

 

原文地址:https://www.cnblogs.com/Ackermann/p/5709821.html