只适用于最大和大于等于0的情况。
全是负数也简单,只取最大的负数即可。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
int main()
{
while (1)
{
int n;
scanf("%d",&n);
if (!n)
break;
int i;
int A[10005];
for (i=0;i<=n-1;i++)
scanf("%d",&A[i]);
int sum=0;
int maxn=-1;
int start,end,record=0;
int flag=0;
for (i=0;i<=n-1;i++)
{
if (A[i]>=0)
flag=1;
sum+=A[i];
if (sum<0)
{
sum=0;
record=i+1;
}
else if (sum>maxn)
{
maxn=sum;
start=record;
end=i;
}
}
if (flag)
printf("%d %d %d\n",maxn,A[start],A[end]);
else
printf("0 %d %d\n",A[0],A[n-1]);
}
return 0;
}
dp做法:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
int n;
while (1)
{
scanf("%d",&n);
if (!n) break;
int A[10005];
int dp[10005];
int i;
for (i=0;i<=n-1;i++) scanf("%d",&A[i]);
int first[10005];
dp[0]=A[0];
first[0]=0;
int flag;
if (A[0]>0)
flag=1;
else
flag=0;
for (i=1;i<=n-1;i++)
{
if (!flag && A[i]>=0)
flag=1;
if (dp[i-1]>0)
{
dp[i]=A[i]+dp[i-1];
first[i]=first[i-1];
}
else
{
dp[i]=A[i];
first[i]=i;
}
}
int last,maxn=-999999999;
for (i=0;i<=n-1;i++)
{
if (dp[i]>maxn)
{
maxn=dp[i];
last=i;
}
}
if (!flag)
printf("0 %d %d\n",A[0],A[n-1]);
else
printf("%d %d %d\n",maxn,A[first[last]],A[last]);
}
return 0;
}