HDOJ1231 最大连续子序列

题目大意:求最大连续子序列和,并输出其序列的首元素和尾元素。

题解:方程非常简单:d[i]=max(0,d[j-1])+a[i],主要是最大连续子序列和的首元素和尾元素怎么记录的问题,其实也非常简单,就是在当我们求以位置i为结束位置的最大连续子序列和的时候,顺便记录下以位置i结束的最大连续子序列和的首元素和尾元素,如果序列的长度为1,则尾元素和首元素都是a[i],如果大于1,则首元素为d[i-1]的首元素,尾元素依然是a[i]。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 10005
typedef struct
{
    long x,y;
}NODE;
NODE path[MAXN];
long d[MAXN],a[MAXN];
int main(void)
{
    long i,n,maxs,l,r,flag;
    while(scanf("%ld",&n)!=EOF)
    {
        if(n==0) break;
        flag=0;
        for(i=0; i<n; i++)
        {
            scanf("%ld",&a[i]);
            if(a[i]>=0) flag=1;
        }
        if(!flag)
        {
            printf("%d %ld %ld\n",0,a[0],a[n-1]);
            continue;
        }
        memset(d,0,sizeof(d));
        d[0]=a[0];
        maxs=d[0];
        l=a[0];
        r=a[0];
        for(i=1; i<n; i++)
        {
            if(d[i-1]<0)
            {
                d[i]=a[i];
                path[i].x=a[i];
                path[i].y=a[i];
            if(d[i]>maxs)
            {
                maxs=d[i];
                l=a[i];
                r=a[i];
            }
            }
            else
            {
                d[i]=d[i-1]+a[i];
                path[i].x=path[i-1].x;
                path[i].y=a[i];
                if(d[i]>maxs)
                {
                    maxs=d[i];
                    l=path[i].x;
                    r=path[i].y;
                }
            }

        }
        printf("%ld %ld %ld\n",maxs,l,r);
}
    return 0;
}

  

原文地址:https://www.cnblogs.com/zjbztianya/p/2997071.html