dp解法
#include<bits/stdc++.h>
using namespace std;
int a[10020],dp[10020],l[10020],r[10020];
int main()
{
int K;
while(scanf("%d",&K)==1&&K)
{
for(int i=1;i<=K;i++)
scanf("%d",&a[i]);
dp[0]=0,l[0]=1,r[0]=0;
for(int i=1;i<=K;i++)
{
if(dp[i-1]+a[i]>=a[i])
{
dp[i]=dp[i-1]+a[i];
r[i]=r[i-1]+1;
l[i]=l[i-1];
}
else
{
dp[i]=a[i];
l[i]=i;
r[i]=i;
}
}
int ans=-1;
int L,R;
for(int i=1;i<=K;i++)
{
if(dp[i]>ans)
{
ans=dp[i];
L=l[i];
R=r[i];
}
}
if(ans==-1)
printf("0 %d %d\n",a[1],a[K]);
else
printf("%d %d %d\n",ans,a[L],a[R]);
}
return 0;
}
非dp解法
#include<bits/stdc++.h>
using namespace std;
int a[10020];
int main()
{
int K;
while(scanf("%d",&K)==1&&K)
{
int s=0,l=1;
int L=1,R=1;
for(int j=1;j<=K;j++)
scanf("%d",&a[j]);
int M=a[1];
for(int j=1;j<=K;j++)
{
s+=a[j];
if(s>M)
{
L=l;
M=s;
R=j;
}
if(s<0)
{
s=0;
l=j+1;
}
}
if(M<0)
{
M=0;
L=1;
R=K;
}
printf("%d %d %d\n",M,a[L],a[R]);
}
return 0;
}