Hdu 1231 最大连续子序列

基础DP。

CODE:

#include <stdio.h>
#include <stdlib.h>
#include < string.h>
using  namespace std;
const  int maxn =  10001;
int a[maxn];
int beg, end;  // 开始,结束 


int get_max( int *a,  int n)        // 算法复杂度为O(n) 
{
     int i, j;
    beg = end =  0;
     int MaxSum =  0, ThisSum =  0, index =  0;
     int cnt =  0, pos =  0;
     for(i =  0 ; i < n; i++)
    {
        ThisSum += a[i];
         if(a[i] <  0)    cnt++;                // 记录是否全部为负数 
         if(ThisSum > MaxSum)
        {
            beg = pos;       // beg标记开始 
            MaxSum = ThisSum;
            end = i;        // end记录结束 
        }
         if(ThisSum <  0)
        {
            ThisSum =  0;
            pos = i+ 1;     // 记录新的开始 
        }
    }
     if(MaxSum ==  0)                          // 有多个0,其他的为负数 
    {
         for(i =  0 ; i  < n; i++)
        {
             if(!a[i])
            {
                index = i;
                 break;
            }
        }
        beg = end = index;
    }
     if(cnt == n)                            // 全部为负数的情况 
    {
        MaxSum =  0;
        beg =  0
        end = n- 1;
    }
     return MaxSum;
}


int main()
{
     int n;
     while(~scanf( " %d ", &n))
    {
         int i, j;
         if(n ==  0break;
        memset(a,  0sizeof(a));
         for(i =  0 ; i < n ; i++)
        {
            scanf( " %d ", &a[i]);
        }
        printf( " %d  ", get_max(a, n));
        printf( " %d %d\n ",a[beg], a[end]);
    }
     return  0;

} 

你可能感兴趣的:(HDU)