6 -2 11 -4 13 -5 -2 10 -10 1 2 3 4 -5 -23 3 7 -21 6 5 -8 3 2 5 0 1 10 3 -1 -5 -2 3 -1 0 -2 0
20 11 13 10 1 4 10 3 5 10 10 10 0 -1 -2 0 0 0HintHint
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 10005
int dp[N],a[N];
int main()
{
int i,n;
while(scanf("%d",&n),n)
{
int flag=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]>=0)
flag=1;
}
if(flag==0) //a数组都为负数
{
printf("0 %d %d\n",a[1],a[n]);
continue;
}
dp[1]=a[1];
for(i=2;i<=n;i++)
{
if(dp[i-1]<0) //自己理解一下吧
dp[i]=a[i];
else
dp[i]=dp[i-1]+a[i];
}
int pos=1;
for(i=2;i<=n;i++)
if(dp[i]>dp[pos]) //注意是 > ,题目找最小的终点
pos=i; //找出最大dp位置
int s,temp=0;
for(i=pos;i>=1;i--)
{
temp+=a[i];
if(temp==dp[pos]) //注意,不是break,因为题目说最小的起点
s=i;
}
printf("%d %d %d\n",dp[pos],a[s],a[pos]);
}
return 0;
}
HDU 1231 最大连续子序列,布布扣,bubuko.com
原文地址:http://blog.csdn.net/u014737310/article/details/38356203