标签:io for c amp r bs as dp poj
题目:找到一个序列中的两个连续段使得他们的和最大。
分析:dp,最大字段和。双向求最大字段和,枚举结束点找到加和最大值。
说明:与合唱队形类似。(同poj2593)(2011-09-24 02:09)
#include <stdio.h>
#include <stdlib.h>
int data[ 50005 ];
int asum[ 50005 ];
int bsum[ 50005 ];
void msum( int *D,int *A, int a, int b, int s )
{
int sum = 0;
for ( int i = a ; i != b ; i += s ) {
if ( sum < 0 ) sum = 0;
sum += D[ i ];
A[ i ] = sum;
}
int max = A[ a ];
for ( int i = a+s ; i != b ; i += s )
if ( max < A[ i ] ) max = A[ i ];
else A[ i ] = max;
}
int main()
{
int t,n;
while ( scanf("%d",&t) != EOF )
while ( t -- ) {
scanf("%d",&n);
for ( int i = 1 ; i <= n ; ++ i )
scanf("%d",&data[ i ]);
msum( data, asum, 1, n, +1 );
msum( data, bsum, n, 1, -1 );
int max = -20000;
for ( int i = 1 ; i < n ; ++ i )
if ( max < asum[ i ] + bsum[ i+1 ] )
max = asum[ i ] + bsum[ i+1 ];
printf("%d\n",max);
}
return 0;
}
标签:io for c amp r bs as dp poj
原文地址:http://blog.csdn.net/mobius_strip/article/details/39348593