zoukankan      html  css  js  c++  java
  • 最大和

    【题目描述】

    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;
    }

     

  • 相关阅读:
    05
    04
    03
    02
    01
    drf 频率类
    drf 视图家族
    drf 之 群改,单改接口
    drf 序列化
    drf 之模块
  • 原文地址:https://www.cnblogs.com/Ackermann/p/5709821.html
Copyright © 2011-2022 走看看