暴力枚举:
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,a[1005];
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i];
}
int max1 = 0;
for(int i = 1; i <= n; i++){
int sum = 0;
for(int j = i; j <= n; j++){
sum += a[j];
if(sum > max1){
max1 = sum;
}
}
}
cout << max1 << endl;
return 0;
}
二分法:
/*****
分治
要么左半取最大,要么右半去最大,要么两边合起来去最大
(感觉在说废话)
用cin,cout可能会超时。
******/
#include <iostream>
#include <cstdio>
using namespace std;
const int max1 = 50001;
int a[max1];
int count1,n;
int f(int l,int r)
{
int sum=0;
count1++;
if(l == r)
{
if(a[l] >= 0)
sum = a[l];
else
sum = 0;
}
else
{
int mid = (l+r)/2;
int leftsum = f(l,mid); ///求左半最大和
int rightsum = f(mid+1,r);///右半最大和
int sum0,sum1,sum2;
sum0 = sum1 = 0;
for(int i = mid; i >= l; i--) ///以下代码都是求中间的最大和
{
sum0+=a[i];
if(sum0 > sum1)
sum1 = sum0;
}
sum0 = sum2 =0;
for(int i = mid+1; i <= r; i++)
{
sum0+=a[i];
if(sum0 > sum2)
sum2 = sum0;
}
sum = sum1+sum2; ///中间最大和
sum = max(sum,leftsum);
sum = max(sum,rightsum);
}
return sum;
}
int main()
{
int n;
scanf("%d",&n);
for(int i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
}
int sum = f(1,n);
printf("%d %d\n",sum,count1);
return 0;
}