最大连续和
方法一:暴力求解
枚举左端点,枚举右端点,计算该范围内的值,并打擂台。
时间复杂度:O(
#include <bits/stdc++.h>
using namespace std;
const int MaxN = 50000;
const int INF = 2147483647;
int a[MaxN+1];
int main()
{
int n,ans=-INF;
cin >> n;
for (int i=1;i<=n;i++) cin >> a[i];
for (int i=1;i<=n;i++) // 枚举左端点
for(int j=i;j<=n;j++;) // 枚举右端点
{
int s=0;
for (int k=i;k<=j;k++) s+=a[k];
ans = max(ans,s);
}
cout << ans << endl;
return 0;
}
方法二:前缀和优化
计算该数组的前缀和数组s:s[0]=0, s[i]=s[i-1]+a[i]
这样,最内层求和可以用前缀和的差直接O(1)计算得到。
时间复杂度:O(
#include <bits/stdc++.h>
using namespace std;
const int MaxN = 50000;
int a[MaxN+1],s[MaxN+1];
const int INF = 2147483647;
int main()
{
int n,ans=-INF;
cin >> n;
for (int i=1;i<=n;i++)
{
cin >> a[i];
s[i]=s[i-1]+a[i];
}
for (int i=1;i<=n;i++) // 枚举左端点
for(int j=i;j<=n;j++;) // 枚举右端点
ans = max(ans,s[j]-s[i-1]);
cout << ans << endl;
return 0;
}