本题为动态规划求最大连续子序列
接触到题目后第一次源代码如下:
#include<iostream>
using namespace std;
int main()
{
int i,j,k;
while(cin>>k)
{
if(k==0)
break;
int* a=new int[k];
int max=-1;
int begin,end;
int flag=0;
for(i=0;i<k;i++)
{
cin>>a[i];
if(a[i]>=0)
flag=1;
}
for(i=0;i<k;i++)
{
int sum=0;
for(j=i;j<k;j++)
{
sum+=a[j];
if(sum>max)
{
max=sum;
begin=a[i];
end=a[j];
}
}
}
if(flag==0)
cout<<"0"<<" "<<a[0]<<" "<<a[k-1]<<endl;
else
cout<<max<<" "<<begin<<" "<<end<<endl;
}
return 0;
}
经过本机编译器的测试可行,但当提交时结果却是"Time Limit Exceeded"。这说明题目开发者希望我们能使用更快的方法来实现。
经过再次分析题目重新进行编写源代码,提交后可通过测试,源代码如下:
#include<iostream>
using namespace std;
int main()
{
int i,k;
while(cin>>k)
{
if(k==0)
break;
int* a=new int[k];
int flag=0;
for(i=0;i<k;i++)
{
cin>>a[i];
if(a[i]>=0)
flag=1;
}
int sum=0,max=-1;
int begin,end,temp=a[0];
for(i=0;i<k;i++)
{
sum+=a[i];
if(sum>max)
{
max=sum;
end=a[i];
begin=temp;
}
if(sum<0)
{
temp=a[i+1];
sum=0;
}
}
if(flag==0)
cout<<"0"<<" "<<a[0]<<" "<<a[k-1]<<endl;
else
cout<<max<<" "<<begin<<" "<<end<<endl;
}
return 0;
}