最大连续和
首先用枚举:
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; }