基础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;

} 

posted on 2012-07-20 13:52  有间博客  阅读(146)  评论(0编辑  收藏  举报