最大连续和问题
给出一个长度为n的序列A1,A2,A3,…,An,求最大连续和。换句话说,要求找到1<=i<=j,使得A[i]+A[i+1]+…+A[j]尽量大。
使用枚举
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#define N 10002
using namespace std;
int main()
{
int a[N],n;
while(~scanf("%d",&n)){
int cnt=0;///测试程序做了多少次加法计算
int best=a[0];///初始化最大值
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++){///检查连续子序列A[i],...A[j]
int sum=0;///累计和
for(int k=i;k<=j;k++){
sum+=a[k];
cnt++;
}
if(sum>best)
best=sum;///更新最大值
}
cout<<cnt<<" "<<best<<endl;
}
}
优化:
S(i)=A1+A2+…+Ai,S(j)=A1+A2+…+Aj;
S(j)-S(i-1)=A(i)+A(i+1)+…+A(j),从第i个数到第j个数是前j个数的和减去前i-1个数的差。
因此,多开一个数组S[]来计算前i项的和,这样两层循环就可以找出最大的连续和了。
s[0]=0;///注意初始化
for(int i=1;i<=n;i++)
s[i]=s[i-1]+a[i];///计算前i项的和
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
best=max(best,s[j]-s[i-1]);///遍历求最大