柱爷与最大区间和
Time Limit: 1000/1000MS (Java/Others) Memory Limit: 131071/65535KB (Java/Others)
Submit Status
柱爷爱思考,凡事喜欢举一反三,常常能想到别人没想过的问题。
比如最大区间和这个问题:在一数列上选出一段区间,使得这段区间和最大。
柱爷想:如果选出两段区间(不相邻)会怎样呢?
柱爷很快想到了答案,你呢?
Input
第一行输入一个数N
N
,表示数组的长度。
第二行输入N
N
个数,表示各元素的值。
数据保证:
•3≤N≤500000
3≤N≤500000
•−100
#include<cstdio>
#include<algorithm>
using namespace std;
const int K = 5e5 + 10;
int a[K],m[K];
int main()
{
int n;
scanf("%d",&n);
int ans,cut;
for(int i = 1; i <= n; i++)
scanf("%d",&a[i]);
m[n] = ans = a[n];
for(int i = n - 1; i >= 1 ; i--){
if(ans < 0) ans = 0;
ans += a[i];
m[i] = max(m[i + 1],ans);
}
cut = a[1] + m[3],ans = a[1];
for(int i = 2; i <= n - 2; i++){
if(ans < 0) ans = 0;
ans += a[i];
cut = max(cut,ans + m[i + 2]);
}
printf("%d\n",cut);
return 0;
}