题目:
分析:
写了一个多小时的代码,
因为连这都搞混了:
1.到i为止的最大和
2.包含i的最大和
代码:
if(L+M==A.size()) return accumulate(A.begin(),A.end(),0);
//A1[i] 表示到i位置的连续L个最大和。
vector<int> A1(A.size(),-(1<<29));
A1[L-1]=accumulate(A.begin(),A.begin()+L,0);
for(int i=L;i<A.size();i++)
{
A1[i]=A1[i-1]+A[i]-A[i-L];
}
//A2[i] 表示到i位置的连续M个最大和。
vector<int> A2(A.size(),-(1<<29));
A2[M-1]=accumulate(A.begin(),A.begin()+M,0);
for(int i=M;i<A.size();i++)
{
A2[i]=A2[i-1]+A[i]-A[i-M];
}
//A3[i] 表示到i位置的连续L个最大和。 ---逆着
vector<int> A3(A.size(),-(1<<29));
A3[A.size()-L]=accumulate(A.end()-L,A.end(),0);
for(int i=A.size()-L-1;i>=0;i--)
{
A3[i]=A3[i+1]+A[i]-A[i+L];
}
//A4[i] 表示到i位置的连续M个最大和。 ---逆着
vector<int> A4(A.size(),-(1<<29));
A4[A.size()-M]=accumulate(A.end()-M,A.end(),0);
for(int i=A.size()-M-1;i>=0;i--)
{
A4[i]=A4[i+1]+A[i]-A[i+M];
}
int maxx=-(1<<30);
for(int i=1;i<A.size();i++)
{
maxx=max(maxx,A1[i-1]+A4[i]);
}
for(int i=1;i<A.size();i++)
{
maxx=max(maxx,A2[i-1]+A3[i]);
}
for(int i=0;i<A.size();i++) cout<<A1[i]<<' ';
cout<<endl;
for(int i=0;i<A.size();i++) cout<<A2[i]<<' ';
cout<<endl;
for(int i=0;i<A.size();i++) cout<<A3[i]<<' ';
cout<<endl;
for(int i=0;i<A.size();i++) cout<<A4[i]<<' ';
cout<<endl;
return maxx;