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;
}
浙公网安备 33010602011771号