最大连续和

首先用枚举:

 1 #include<iostream>
 2 using namespace std;
 3 int n,a[11000];
 4 int main()
 5 {
 6     cin>>n;
 7     for(int i=1;i<=n;i++)
 8     {
 9         cin>>a[i];
10     }
11     int maxn=0,sum=0;
12     for(int i=1;i<=n;i++)
13     {
14         for(int j=1;j<=n;j++)
15         {
16             sum=0;
17             for(int k=i;k<=j;k++)
18             {
19                 sum+=a[k];
20             }
21             maxn=max(maxn,sum);
22         }
23     }
24     cout<<maxn;
25 }

这应该是每个人不看N范围的第一反应......(大佬除外),但看到N<=200000......我们发现n³妥妥的爆,我想的方法是前缀和书上的方法也是,时间复杂度是O(N²):

 1 #include<iostream>
 2 using namespace std;
 3 long long n,a[210000];
 4 long long ans[210000];
 5 int main()
 6 {
 7     cin>>n;
 8     for(long long i=1;i<=n;i++)
 9     {
10         cin>>a[i];
11     }
12     for(long long i=1;i<=n;i++) ans[i]=ans[i-1]+a[i];
13     long long maxn=-2000001,sum=0;
14     for(long long i=1;i<=n;i++)
15     {
16         for(long long j=i;j<=n;j++)
17         {
18             maxn=max(maxn,ans[j]-ans[i-1]);
19         }
20     }
21     cout<<maxn;
22 }

发现还是会TLE.....,于是书上用二分去算.....是nlog(n)的时间复杂度.....但我用的是O(n)的复杂度:

#include<bits/stdc++.h>
using namespace std;
int x;
int n;
int sum=0;
int maxn=-2147483647;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        sum=max(sum+x,x);//用DP的思想,选,不选
        maxn=max(maxn,sum);
    }
    printf("%d",maxn);
    return 0;
}

 

posted @ 2018-08-22 16:22  DJY_01  阅读(110)  评论(0编辑  收藏  举报