给出一个整数序列,求出两个连续序列和的和最大值,这两个序列不必连续,但是不能交叉
可以先正向求一次最大和,dp[i]表示i之前包括i的最大连续和的值
然后反向求一次最大和,相加dp[i]对比求出最大值
#include <stdio.h>
#define MIN -9999999
int main()
{
int T;
scanf("%d",&T);
int sum,tmp,n,ans;
int num[50001],dp[50001];
while(T--)
{
scanf("%d",&n);
sum=0;
tmp=MIN;
for(int i=0;i<n;i++)
{
scanf("%d",&num[i]);
sum+=num[i];
if(sum>tmp)
tmp=sum;
dp[i]=tmp;
if(sum<0) sum=0;
}
sum=0;
tmp=ans=MIN;
for(int i=n-1;i>0;i--)
{
sum+=num[i];
if(sum>tmp) tmp=sum;
if(tmp+dp[i-1]>ans) ans=tmp+dp[i-1];
if(sum<0) sum=0;
}
printf("%d\n",ans);
}
return 0;
}

浙公网安备 33010602011771号