#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;//#include<algorithm>using namespace std;为了调用库函数max
int dp[10005];
int main()
{
int a[10005];
int start[10005],end[10005];//记录和最大的位置
int K;
while(scanf("%d",&K))
{
if(K==0)
return 0;
int i;
for(i=1;i<=K;i++)
scanf("%d",&a[i]);
memset(dp,0,sizeof(dp));
for(i=1;i<=K;i++)//初始化每个位置dp开始都等于该位置的a[i],start,end就是本位置i
{
dp[i]=a[i];
start[i]=i;
end[i]=i;
}
dp[1]=a[1];//注意开始位置,养成好习惯
for(i=2;i<=K;i++)//有dp[i-1]从2开始
{
if(dp[i-1]<0)//每到一个新的数无非就两种情况,一种是前面的最大序列和小于0,另一种是大于等于0
{
dp[i]=a[i];//小于0就重新开始,计数,因为不论什么数加上一个负数只会更小
}
else
{
dp[i]=dp[i-1]+a[i];//大于等于0无论,a[i]这个数无论正负,dp[i-1]+a[i]>=a[i]
start[i]=start[i-1];//开始位置调整为和前面一样,末尾位置,初始化时,已经处理过了
}
}
int max=-99999999,maxi=0;//该序列有负数,要保证max足够小
for(i=1;i<=K;i++)//求解最大dp
if(max<dp[i])
{
max=dp[i];
maxi=i;//记录位置
}
if(max<0)
{
printf("0 %d %d\n",a[1],a[K]);//题目要求max<0直接输出开始和末尾的数
}
else
{
printf("%d %d %d\n",max,a[start[maxi]],a[end[maxi]]);
}
}
return 0;
}
HDU 1231 最长连续子序列
最新推荐文章于 2020-04-03 22:44:55 发布