标签:ace 分解 include 一个 -- put names math 有一个
给定有n个整数(可能为负整数)组成的序列a1,a2,...,an,求该序列连续的子段和的最大值。 如果该子段的所有元素和是负整数时定义其最大子段和为0。
第一行有一个正整数n(n<1000),后面跟n个整数,绝对值都小于10000。直到文件结束。
输出它的最大子段和。
6 -2 11 -4 13 -5 -2
20
将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
#include <iostream>
#include <math.h>
using namespace std;
int *p;
int f(int l,int r){
if(l==r)
return p[r];
int mid = (l + r)/2;
int t1 = f(l,mid);
int t2 = f(mid+1,r);
int maxl=0,maxr=0;
int sum = 0;
for(int i=mid;i>=l;i--){
sum+=p[i];
if(sum>maxl)
maxl = sum;
}
sum = 0;
for(int i=mid+1;i<=r;i++){
sum+=p[i];
if(sum>maxr)
maxr = sum;
}
return max(max(t1,t2),maxl+maxr);
}
int main()
{
int n;
cin>>n;
p = new int[n];
for(int i=0;i<n;i++){
cin>>p[i];
}
int res = f(0,n-1);
cout<<res<<endl;
return 0;
}
标签:ace 分解 include 一个 -- put names math 有一个
原文地址:https://www.cnblogs.com/chengejie/p/14026163.html