LeeBlog

导航

HDU 1231 最大连续子序列

这题是一郁闷题,开始我想了好久没思路,最后想到前面不是做了几个类似的DP么,只要把前一个的最大子序列找到了,那当前这一个的最大子序列就好办了,因此又是一个从前往后解决的问题,不过要注意最后一组测试数据,我在这里错了好几次

#include<stdio.h>
#include<string.h>
int k,num[10024],add[10024],pri[10024],pos;
void cal( )
{
    int m = 0;
    for( int i = 1; i <= k; ++i )
    {
        if( (add[i-1] + num[i]) > 0 && add[i-1] > 0 )
        {
            add[i] = add[i-1] + num[i];
            pri[i] = pri[i-1];
        }
        else
        {
            if( num[i] > 0 )
                add[i] = num[i];
            else
                add[i] = 0;
        }
        if( add[i]  > add[pos] )
            pos = i;
    }
    if( add[pos] == 0 )
        pos = k,pri[k] = 1;
    if( add[pos] == 0 )
        for( int i = 1; i <= k; ++i )
            if( num[i] == 0 )
                pos = i;
}
int main( )
{
    while( scanf( "%d",&k ),k )
    {
        memset( add,0,sizeof( add ) );
        memset( num,0,sizeof( num ) );
        pos = pri[0] = 0;
        for( int i = 1; i <= k ; ++i )
            scanf( "%d",&num[i] ),pri[i] = i;
        cal();
        printf( "%d %d %d\n",add[pos],num[pri[pos]],num[pos] );
    }
    return 0;
}

posted on 2011-04-22 17:12  LeeBlog  阅读(619)  评论(0编辑  收藏  举报