#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int n;
vector<int> numVec;
vector<int> maxSumEnd;
cin>>n;
int k=n;
int curSum=0;
int maxSum=0;
int num;
cin>>num;
curSum=num;
maxSum=num;
numVec.push_back(num);
maxSumEnd.push_back(curSum);
while(--n)
{
cin>>num;
numVec.push_back(num);
if(curSum<0)
{
curSum=num;
}else
{
curSum+=num;
}
if(curSum>maxSum)maxSum=curSum;
maxSumEnd.push_back(curSum);
}
if(maxSum<0)
{
cout<<0<<" "<<numVec[0]<<" "<<numVec[k-1];
return 0;
}
// for(int i=0;i<maxSumEnd.size();i++)cout<<maxSumEnd[i]<<" ";
// cout<<endl;
int begin;
int end;
for(size_t i=0;i<maxSumEnd.size();i++)
if(maxSumEnd[i]==maxSum)
{
end=i;
break;
}
int total=0;
for(int i=end;i>=0;i--)
{
total+=numVec[i];
if(total==maxSum)
{
begin=i;
}
}
cout<<maxSum<<" "<<numVec[begin]<<" "<<numVec[end];
}
注:这题回顾了求最长序列和的算法。利用一个maxSumEnd数组记录以i结尾的最长序列和。curSum和maxSum分别记录当前以i-1结尾的序列和,maxSum存放的当前最大序列和。如果curSum<0.说明i之前的和小于0,那么maxSumEnd[i]=numVec[i]。否则curSum+=numVec[i]。同时比较maxSum和curSum。
(PAT)1007. Maximum Subsequence Sum
最新推荐文章于 2022-06-12 00:02:02 发布