標籤: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;}
poj 2479 - Maximum sum