//最大子段和
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector <int> v; //v[i]为第i(从0开始)个元素
//状态f(i):以v[i]为最后一个元素时的最大和
int dp(int &start, int &end)
{
int sum=0,max=0,curStart=0;
for(int i=0;i<v.size();i++)
{
sum+=v[i];
if (sum<0) //不能包含v[i]
{
sum=0;
curStart=i+1;
}
else if (sum>max) //包含v[i]且最大和比原来的大
{
max=sum;
start=curStart;
end=i;
}
}
return max;
}
void run(int now)
{
int n;
cin>>n;
v.resize(n); //重定义向量的大小
int cnt=0;
for(int i=0;i<n;i++)
{
cin>>v[i];
if (v[i]<=0) cnt++; //统计非正数
}
if (now>1) cout << endl; //用now控制每组测试之间留一个空行
cout << "Case " << now << ":\n";
int start,end,result;
if (cnt==n) //全为非正的整数
{
vector <int>::iterator it=max_element(v.begin(),v.end()); //求出最大值的指针
start=end=it-v.begin();
result=*it; //取it所指单元的内容
}
else
result=dp(start,end);
cout << result << " "<< start+1 << " "<< end+1 << endl;
}
int main()
{
int total;
cin>>total;
for(int now=1; now<=total; now++) run(now);
return 0;
}
HDOJ 1003 Max Sum参考程序
最新推荐文章于 2021-04-11 12:22:24 发布