给定有n个整数(可能为负整数)组成的序列a1,a2,…,an,求该序列连续的子段和的最大值。 如果该子段的所有元素和是负整数时定义其最大子段和为0。
分治:时间复杂度:nlogn
#include <iostream>
using namespace std;
int a[100005];
int maxnum(int l,int r)
{
int sum=0;
if(l==r)
{
if(a[l]>0)
sum= a[l];
else
sum= 0;
}
else
{
int m=(l+r)/2;
int lsum=maxnum(l,m);
int rsum=maxnum(m+1,r);
int s1=0;
int ls=0;
for(int j=m; j>=l; j--)
{
ls+=a[j];
if(ls>s1)
s1=ls;
}
int s2=0;
int rs=0;
for(int j=m+1; j<=r; j++)
{
rs+=a[j];
if(rs>s2)
s2=rs;
}
sum=s1+s2;
if(sum<lsum)
sum=lsum;
if(sum<rsum)
sum=rsum;
}
return sum;
}
int main()
{
int n;
cin>>n;
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
int s=maxnum(0,n-1);
cout<<s;
return 0;
}
动态规划:时间复杂度:n
#include<iostream>//
using namespace std;
int main()
{
int n;
scanf("%d",&n);
int s[10001];
int js=0;
int sum=0;
for(int i=1; i<=n; i++)
scanf("%d",&s[i]);
for(int i=1; i<=n; i++)
{
if(js<0)
js=s[i];
else
js+=s[i];
if(js>sum)
sum=js;
}
cout<<sum;
}