poj 2479 Maximum sum

该题是一道简单的DP题,我采用两头分别求最大的和,先顺序求每个数段的最大和,然后反过来求每个数段的最大的和;

分析:先求顺序从左到右到该数的最大和;反序就是SUM[i-1]=SUM[i]+num[i-1

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int n,T,num[50024],sum[50024],a,SUM[50024];
scanf( "%d",&T );
while( T-- )
{
memset( sum,0,sizeof( sum ) );
scanf( "%d",&n );
scanf( "%d",&num[0] );
sum[0]=num[0];
for( int i=1;i<n;i++ )
{
scanf( "%d",&num[i] );
if( sum[i-1]>0 )
sum[i]=sum[i-1]+num[i];
else sum[i]=num[i];
}
int maxsum=-100000,max=num[n-1];
SUM[n-1]=num[n-1];
for( int i=n-1;i>0;i-- )
{
if( SUM[i] > 0 )
SUM[i-1]=SUM[i]+num[i-1];
else SUM[i-1]=num[i-1];
if( SUM[i] > max )
max=SUM[i];
if( sum[i-1]+max > maxsum )
maxsum=sum[i-1]+max;
}
printf( "%d\n",maxsum );
}
return 0;
}


];假设最大的两个数段和的分界点为i并且在该点的数段和大于i+1~n的最大数段和

( sum[i-1]+max > maxsum )则maxsum=sum[i-1]+max;

posted @ 2011-11-17 17:23  wutaoKeen  阅读(264)  评论(0编辑  收藏  举报