题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1003
本题要求求一数列a[n]中某连续子序列的和的最大值,如果直接枚举所有情况会超时。
此题可以建立一个数组ans[i]表示a[n]的子列中最后一个元素为a[i]的子序列的所有元素之和。
那么ans[i+1]=max{ans[i]+a[i+1],a[i+1]}。
再找到ans[i]的最大值即可。
#include<iostream>
using namespace std;
const int maxn=100010;
int T,N,a[maxn],b[2],e[2],ans[2]; //b[0],e[0],ans[0]分别表示目前最大子序列的首地址,尾地址,元素之和
int main()
{
cin>>T;
for(int t=1;t<=T;t++)
{
if(t>1) cout<<endl;
cin>>N>>a[0];
ans[0]=ans[1]=a[0];
b[0]=b[1]=e[0]=e[1]=0;
for(int i=1;i<N;i++)
{
cin>>a[i];
if(ans[1]<0)
{
ans[1]=a[i];
b[1]=e[1]=i;
}
else
{
ans[1]+=+a[i];
}
if(ans[1]>ans[0])
{
ans[0]=ans[1];
b[0]=b[1];
e[0]=i;
}
}
cout<<"Case "<<t<<":\n"<<ans[0]<<' '<<b[0]+1<<' '<<e[0]+1<<endl;
}
return 0;
}