void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出一个整数序列,求出两个连续序列和的和最大值,这两个序列不必连续,但是不能交叉

可以先正向求一次最大和,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;
}
posted on 2011-05-31 23:04  void-man  阅读(203)  评论(0)    收藏  举报