典型的求最大子数组和的问题,在前面的一篇文章中已经讨论过这个算法了.STL标准库为我们提供了一个更好操作的模版---vector, 相比数组, vector具有可动态增长的特点,不像数组一旦定义,空间就已经固定不变了。与我们可以用指针访问数组一样,我们使用迭代器(一种数据类型)来访问容器内的元素。所以A掉这个题目并不难,下面就是ac代码
#include <iostream>
#include <vector>
using namespace std;
using std::vector;
int Max_SubArray(vector<int>::iterator pia,int len,int *start_script,int *end_script)
{
int max_sum=0;
int i,flag=0;
int temp_sum=0;
int start=0,end;
for(i = 0;i != len;++i)
{
if(temp_sum < 0)
{
temp_sum=pia[i];
end=i;
start=i;
}
else
{
temp_sum += pia[i];
end=i;
}
if(temp_sum > max_sum)
{
max_sum=temp_sum;
*start_script=start;
*end_script=end;
}
}
if(max_sum==0)
{
max_sum=pia[0];
*start_script=0;
*end_script=0;
for(i = 0;i != len;++i)
{
if(pia[i] > max_sum)
{
max_sum=pia[i];
*start_script=i;
*end_script=i;
}
}
}
return max_sum;
}
int main()
{
int ival;
int len,n,ai;
int start,end;
int re,i,count=0,flag;
cin>>n;
flag=n;
while(n--){
count++;
vector<int> ivec;
start=0;
end=0;
re=0;
cin>>ival;
for(i=0;i<ival;i++){
cin >> ai;
ivec.push_back(ai);
}
len=ivec.size();
vector<int>::iterator iter = ivec.begin();//定义了一个迭代器类型变量iter,并且初始化指向ivec容器第一个元素
re=Max_SubArray(iter,len,&start,&end); //s,l以引用的形式传入函数,函数处理后返回相应值
cout<<"Case "<<count<<":"<<endl;
cout<<re<<" "<<start+1<<" "<<end+1<<endl;
if(count != flag)
cout<<endl;
}
return 0;
}