采用算法:分治策略
#include<stdio.h>
int num[1000005];
int maxsum(int be,int end){
if(end-be==1) return num[be];//只有一个元素,直接返回
int l,L,r,R,i;r=l=0;
int mid=(end+be+1)/2;//分治第一步,划分
int max;L=maxsum(be,mid);R=maxsum(mid,end);//子问题递归求解
max=L>R?L:R;
L=num[mid-1];
for(i=mid-1;i>=be;i--){l+=num[i];if(l>L) L=l;}//分界点向左的最大连续和L
R=num[mid];
for(i=mid;i<end;i++){r+=num[i];if(r>R) R=r;}//分界点向右的最大连续和R
return (max>(L+R)?max:(L+R));//把子问题的解与L+R比较
}
int main(){
int N,n;
int i;
scanf("%d",&N);
while(N--){
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d",&num[i]);
printf("%d\n",maxsum(0,n));
}
return 0;
}
dp
#include<stdio.h>
#include<string.h>
#define Max(a,b) a>b?a:b
int num[1000001];
int dp[1000001];
int main(){
int i,max;
int N;
scanf("%d",&N);
while(N--){
int n;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&num[i]);
max=dp[0]=num[0];
for(i=1;i<n;i++){
dp[i]=Max(dp[i-1]+num[i],num[i]);
if(dp[i]>max)
max=dp[i];
}
printf("%d\n",max);
}
return 0;
}
另一种方法
#include<stdio.h>
int num[1000001];
int main(){
int i,sum,max;
int N;
scanf("%d",&N);
while(N--){
int n;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&num[i]);
sum=0;
max=num[0];
for(i=0;i<n;i++){
if(sum<0)
sum=0;
sum+=num[i];
if(sum>max)
max=sum;
}
printf("%d\n",max);
}
return 0;
}