题目大意:求最大连续子序列和,并输出其序列的首元素和尾元素。
题解:方程非常简单: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; }