求最大子序列的和,并输出这个最大子序列的头和尾的数字。
还有些小要求就是,如果有两个相等的最大子序列,输出前面的那个,然后如果都是负数,就输出0,第一个数,和最后一个数。
有个点我改了很多遍,就是如果是一堆负数,其中有个零,输出的应该是,0,0,0而不是0,第一个数,最后一个数。
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define INF 0x3fffffff
using namespace std;
int main()
{
int n,x,b,e,a[10005],dp[10005];
cin>>n;
memset(a,0,sizeof(a));
memset(dp,0,sizeof(dp));
for (int i=1;i<=n;i++)
{
cin>>a[i];
dp[i]=max(dp[i-1]+a[i],a[i]);
}
int maxs=0,bb,flag=0;
for (int i=1;i<=n;i++)
{
if (dp[i]==a[i])
bb=i;
if (dp[i]>maxs||(dp[i]==maxs&&maxs==0))
{
flag=1;
maxs=dp[i];
e=i;
b=bb;
}
}
if (flag)
cout<<maxs<<' '<<a[b]<<' '<<a[e];
else
cout<<maxs<<' '<<a[1]<<' '<<a[n];
}