POJ 2479

题目大意:在一个数字串中找到连个连续的字串(这两个字串可以相邻),使得两个字串和最大。

思路:最大字串的变形。找出每个数字左边和最大的串,右边和最大的串, 然后左右相加算出最大的和。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#define MAX 0x6fffffff
using namespace std;

int res[50002][2],num[50002],suml[50002],sumr[50002],maxl[50002],maxr[50002];
int ncase,n;

int main(){
	int i,j,res;
	scanf("%d",&ncase);
	while(ncase--){
		scanf("%d",&n);
		for(i=0;i<n;i++)
		    scanf("%d",&num[i]);
		suml[0] = num[0];
		for(i=1;i<n;i++)
		    if(suml[i-1] > 0)
		        suml[i] = suml[i-1] + num[i];
		    else
		        suml[i] = num[i];
	    sumr[n-1] = num[n-1];
	    for(i=n-2;i>=0;i--)
	        if(sumr[i+1] > 0)
	            sumr[i] = sumr[i+1] + num[i];
	        else
	            sumr[i] = num[i];
	    maxl[0] = suml[0];
		for(i=1;i<n;i++)
		    if(suml[i] < maxl[i-1])
		        maxl[i] = maxl[i-1];
		    else
		        maxl[i] = suml[i];
		maxr[n-1] = sumr[n-1];
		for(i=n-2;i>=0;i--)
		    if(sumr[i] < maxr[i+1])
		        maxr[i] = maxr[i+1];
		    else
		        maxr[i] = sumr[i];
		res = -MAX;
		for(i=0;i<n-1;i++){
			if(res < maxl[i] + maxr[i+1])
			    res = maxl[i] + maxr[i+1];
		}
		printf("%d\n",res);
	}
	return 0;
}
posted @ 2016-03-12 17:19  阿文的博客  阅读(145)  评论(0编辑  收藏  举报