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;
}