POJ2479 Maximum sum

输入数据真变态。。。首先两个子数组长度必须要大于零,其次就是输入数据中有全负数的数据。。。

left_dp保存的是到达i的时候,往左的最大子数组和;right_dp保存的是到达i的时候,往右的最大子数组和。left_dp和right_dp的求法就是最大子数组和求法。

则结果必然是max{left_dp[i-1]+right_dp[i]}


/*******************************************************************************
 # Author : Neo Fung
 # Email : [email protected]
 # Last modified: 2012-03-14 18:46
 # Filename: POJ2479 Maximum sum.cpp
 # Description : 
 ******************************************************************************/
#ifdef _MSC_VER
#define DEBUG
#define _CRT_SECURE_NO_DEPRECATE
#endif

#include <fstream>
#include <stdio.h>
#include <iostream>
#define MAX 50010
using namespace std;

long long num[MAX],left_dp[MAX],right_dp[MAX];
int main(void)
{
#ifdef DEBUG  
  freopen("../stdin.txt","r",stdin);
  freopen("../stdout.txt","w",stdout); 
#endif  

	int ncases,n;
	scanf("%d",&ncases);

	while(ncases--)
	{
		scanf("%d",&n);
		long long total,now;

		for(int i=0;i<n;++i)
		{
			scanf("%lld",&num[i]);
			if(i==0)
			{
				left_dp[i]=total=now=num[0];
				continue;
			}
			now+=num[i];
 			now=max(num[i],now);
			total=max(total,now);
			left_dp[i]=total;
		}

		total=num[n-1];
		now=num[n-1];
    right_dp[n-1]=num[n-1];
		for(int i=n-2;i>=0;--i)
		{
			now+=num[i];
 			now=max(num[i],now);
			total=max(total,now);
			right_dp[i]=total;
		}

		total=-1000000ll;
		for(int i=1;i<n;++i)
			total=max(total,left_dp[i-1]+right_dp[i]);
		printf("%lld\n",total);
	}

  return 0;
}


你可能感兴趣的:(POJ2479 Maximum sum)