题108.pat甲级练习-1007 Maximum Subsequence Sum (25 分)
一、题目
二、题解
求最大子列和的问题,我们采用在线处理来解决,用一个for循环去从头到尾遍历数组,设一个当前和以及一个最大和,每次都把一个数组的元素加到当前和中,然后去和最大和比较,若更大,则更新,若当前和为负数,则此后再加一个正数也不会比只要那一个正数大,所以直接舍去它,将当前和置为0重新开始。最后我们可以得到最大子列和结果。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int N;
cin>>N;
vector<int> data(N);
int flag_nagative=1;
for(int i=0;i<N;i++)
{
cin>>data[i];
if(data[i]>=0)
{
flag_nagative=0;
}
}
int thissum=0,maxsum=0;
vector<int> thispath,maxpath;
maxpath.push_back(0);//开局先放个0到maxpath,从而解决最大子列和为0的情况
for(int i=0;i<N;i++)
{
thissum+=data[i];
thispath.push_back(data[i]);
if(thissum>maxsum)
{
maxsum=thissum;
maxpath=thispath;
}
else if(thissum<0)
{
thissum=0;//如果加上当前得元素以后当前子列和变负数则舍去,
//因为如果之后有个正数出现使它变大得话也不可能比单独那个正数更大
thispath.clear();
}
}
if(flag_nagative==1)//全负数时单独处理
{
cout<<maxsum<<" "<<data[0]<<" "<<data[N-1];
}
else
{
cout<<maxsum<<" "<<maxpath[0]<<" "<<maxpath[maxpath.size()-1];
}
}