LeeBlog

导航

HDU 1003 Max Sum

本题跟最大子序列差不多,是姊妹题,其实解决了上个,这个只要解决几个地方就可以了,请注意如果有全部是负数,就把这些负数中最大的输出来。

#include<stdio.h>
#include<string.h>
int t,n,pos,num[110000],add[110024],pri[110024];
void cal(  )
{
    int pos = 1;
    for( int i = 1; i <= n; ++i )
    {
        if( add[i-1] >= 0 && (add[i-1] + num[i] >= 0) )//here
        {
            add[i] = add[i-1] + num[i];
            pri[i] = pri[i-1];
        }
        else//here
            add[i] = num[i];
        if( add[i] > add[pos] )
            pos = i;
    }
    if( num[pos] < 0 )
        printf( "%d %d %d\n",num[pos],pos,pos );
    else
        printf( "%d %d %d\n",add[pos],pri[pos],pos );
}
int main( )
{
    scanf( "%d",&t );
    for( int i = 1; i <= t; ++i )
    {
        if( i != 1 )
            puts( "" );
        scanf( "%d",&n );
        memset( add,0,sizeof( add ) );
        pri[0] = 1;
        for( int i = 1; i <= n; ++i )
        {
            pri[i] = i;
            scanf( "%d",&num[i] );
        }
        printf( "Case %d:\n",i );
        cal( );

    }
    return 0;
}

posted on 2011-04-22 20:38  LeeBlog  阅读(162)  评论(0编辑  收藏  举报