Max Sum
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 28629 Accepted Submission(s): 6070
2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5
Case 1: 14 1 4 Case 2: 7 1 6
自己写的代码:
#include<iostream>
using namespace std;
#define Max_size 100000
int main()
{
int n,T,max,start,end,sum,a[Max_size],i=1;
cin>>T;
while(T--)
{
max=-1001;
cin>>n;
for(int t=0;t<n;t++)
cin>>a[t];
for(int j=0;j<n;j++)
{
sum=a[j];
if(sum>max)
{
max=sum;
start=end=j+1;
}
for(int k=j+1;k<n;k++)
{
sum+=a[k];
if(sum>max)
{
max=sum;
start=j+1;
end=k+1;
}
}
}
cout<<"Case "<<i<<":"<<endl;
cout<<max<<" "<<start<<" "<<end<<endl<<endl;
i++;
}
return 0;
}
虽然结果是正确的,但是由于超时而不能AC,于是上网找了一下资料,发现一份牛人写的DP算法:
#include <iostream>
using namespace std;
int main()
{
int T,N,num,startP,endP;
cin>>T;
for(int k=0;k<T;k++)
{
cin>>N;
int max=-1001,sum=0,temp=1;
for(int i=0;i<N;i++)
{
cin>>num;
sum+=num;
if(sum>max)
{
max=sum;
startP=temp;
endP=i+1;
}
if(sum<0)
{
sum=0;
temp=i+2;
}
}
cout<<"Case "<<k+1<<":"<<endl<<max<<" "<<startP<<" "<<endP<<endl;
if(k!=T-1) cout<<endl;
}
}