题目:
时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 256MB,其他语言 512MB
描述
给出一个长度为 n 的序列 a,选出其中连续且非空的一段使得这段和最大。
输入描述
第一行是一个整数,表示序列的长度 n。
第二行有 n 个整数,第 i 个整数表示序列的第 i 个数字 ai。输出描述
输出一行一个整数表示答案。
用例输入 1
7 2 -4 3 -1 2 -4 3用例输出 1
4
思路:
这道题实际上可以使用分治法(复杂度为(nlogn),虽然慢一些,但应付这道题还是没有问题的) 分治的思路是讲数列平均分成两部分(按数量劈半)称为L、R,再用一个函数算出所有子段中互相串界(即有L的一部分,也有R的一部分)的子段的和的最大值称为G ,而答案就是L的最大子段和和R的最大子段和和G三个数中的最大值,而L、R的最大子段和也用同样的方法考虑。
AC代码:
#include<bits/stdc++.h>
using namespace std;
long long int qz[2] = {},mm[2] = {},ans = -1e9,m,n;
int main(){
cin >> n;
for(int i = 1;i <= n;i++){
scanf("%lld",&m);
qz[i % 2] = qz[(i + 1) % 2] + m;
mm[i % 2] = min(mm[(i + 1) % 2],qz[(i + 1) % 2]);
ans = max(ans,qz[i % 2] - mm[i % 2]);
}
cout << ans;
return 0;
}