继续用向量实现:
暴力:
#include <string>
#include <iostream>
#include <vector>
#include<climits>
using namespace std;
typedef struct{
unsigned left; unsigned right; int sum;} ma;
ma brute_force(vector<int> &a){
ma record={0,0,INT_MIN};
int as=a.size();
for(int i=0;i<as;++i){
int tsum=0;
for(int j=i;j<as;++j){
tsum+=a[j];
if(record.sum<tsum){
record={i,j,tsum};}}}
return record;}
线性寻找:
ma linear_sa(vector<int> &a){
ma first={0,0,a[0]};
vector<ma> s={first};//s用来保存前面的最大子数列
int as=a.size();
for(int i=1;i!=as;++i){
if(s[i-1].sum<0){
ma bigger={i,i,a[i]};
s.push_back(bigger);}
else{
ma previous=s[i-1];
ma xin={previous.left,i,previous.sum+a[i]};
s.push_back(xin);}}
ma maxx=s[0];
for(int i=1;i<as;++i){
if(maxx.sum<s[i].sum){
maxx=s[i];}}
return maxx;}
验证:
int main(){
vector<int>a=
{13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
ma test=brute_force(a);
cout<<test.left<<" "<<test.right<<" "<<test.sum<<endl;
ma testn=linear_sa(a);
cout<<testn.left<<" "<<testn.right<<" "<<testn.sum<<endl;
return 0;}