B - 柱爷与最大区间和
Time Limit: 1000/1000MS (Java/Others) Memory Limit: 131071/65535KB (Java/Others)
Submit Status
柱爷爱思考,凡事喜欢举一反三,常常能想到别人没想过的问题。
比如最大区间和这个问题:在一数列上选出一段区间,使得这段区间和最大。
柱爷想:如果选出两段区间(不相邻)会怎样呢?
柱爷很快想到了答案,你呢?
Input
第一行输入一个数NN,表示数组的长度。
第二行输入NN个数,表示各元素的值。
数据保证:
3≤N≤5000003≤N≤500000
−100
#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
int d[5000005],b[5000005];
int main()
{
int n;
while(cin>>n)
{
memset(d,0,sizeof(d));
long long x=0,y=0,z=-1000,x1=0,y1=0;
int i,j,k=0;
for(i=0;i<n;i++) {cin>>d[i];}
if(k>0) k=0;
int thissum=0,maxsum=-1000;
int l=0;
for(i=n-1;i>1;i--)
{
thissum+=d[i];
if(thissum>maxsum) {maxsum=thissum;}
b[i]=maxsum;
if(thissum<0) {thissum=0;}
}
thissum=0;maxsum=-1000;
for(i=0;i<n-2;i++)
{
thissum+=d[i];
if(thissum>maxsum) maxsum=thissum;
if(thissum<0) {thissum=0;}
x=maxsum;
if(x+b[i+2]>z) z=x+b[i+2];
}
cout<<z<<endl;
}
return 0;
}