题意:给T组数据,求每组数据序列和最大的序列,输出最大值和起止位置。
做法:建立一个数组a[n]记录数据,f[n]记录到该点时的最大和;
递推可得,如果f[n-1]>=0,f[n]=f[n-1]+a[n];反之,f[n]=a[n];
代码:
#include <iostream>
#include <cstring>
using namespace std;
int i,j,tot[100000],a[100000];
int main()
{
int T,number=1;
cin>>T;
while(T--)
{
int n;
cin>>n;
int f[n],b[n];
memset(a,0,sizeof(a));
memset(f,0,sizeof(f));
memset(tot,0,sizeof(tot));
for(i=0;i<n;i++)
cin>>a[i];
f[0]=a[0],b[0]=0;
for(i=1;i<n;i++)
{
if(f[i-1]>=0)f[i]=f[i-1]+a[i],b[i]=b[i-1];
else f[i]=a[i],b[i]=i;
}
int ans=0,pos=0,start=0;
for(i=0;i<n;i++)
if(ans<f[i])ans=f[i],pos=i,start=b[i];
int j;
for(i=0;i<n;i++)
{
if(a[i]>0)
break;
else if(i==n-1)
{
ans=f[0];
for(j=0;j<n;j++)
f[j]=a[j];
for(j=0;j<n;j++)
if(ans<f[j])ans=f[j],pos=j,start=j;
}
}
cout<<"Case "<<number++<<":"<<endl;
cout<<ans<<" "<<start+1<<" "<<pos+1<<endl;
if(T!=0)
cout<<endl;
}
return 0;
}
错误原因:WA 对于全负数的情况没有加以考虑。