给一序列,求最大连续子序列的和,以及这个序列的开始元素和最后一个元素,若都为负数,和为0,输出原序列第一个和最后一个元素
思路:d【i】存放以第i个元素为结束点的连续序列的和,d【0】=a【0】,顺推(动态规划思想),最后找出d中最大的即可;
first【i】存放以第i个元素为结束点时,此序列的开始元素的下标;
#include<stdio.h>
int a[10000],d[10000],first[10000];
int main()
{
int k,i,j,max,last;
while(scanf("%d",&k)&&k)
{
for(i=0;i<k;i++)
scanf("%d",&a[i]);
d[0]=a[0];
first[0]=0;
for(i=1;i<k;i++)
{
d[i]=a[i];
first[i]=i;
if(d[i-1]+a[i]>d[i])
{
d[i]=d[i-1]+a[i];
first[i]=first[i-1];
}
}
max=d[0];
last=0;
for(i=1;i<k;i++)
if(max<d[i])
{
max=d[i];
last=i;
}
if(max<0)
{
max=0;
printf("%d %d %d\n",max,a[0],a[k-1]);
}
printf("%d %d %d\n",max,a[first[last]],a[last]);
}
return 0;
}