您的位置:首页 > 其它

首尾相连数组的最大子数组和

2013-07-22 10:32 225 查看
1.求0~N-1的最大子数组和 M_1

2.求跨越 N-1和0的最大子数组和,分别求从0开始的最大和M_21,从n-1开始的最大和M_22,分别记录得到最大和的位置pi,pj,这里分两种情况考虑

a.pi<pj,则M=max(M_1,M_21+M_22);

b. pi>=pj,则求0~N-1的最小子数组和M_3,及0~N-1的和Mx ,M=max(M_1,Mx-M_3);

 

#include <iostream>
#include <vector>
using namespace std;
int solve(vector<int> vec){
int n=vec.size();
int sumtotal=0,i;
for(i=0;i<n;++i){
sumtotal+=vec[i];
}
// maxsum of subarray[1...N]
int maxsum=0,sum=0;;
for(i=0;i<n;++i){
if(sum+vec[i]<=0){
sum=0;
}else{
sum+=vec[i];
}
if(sum>maxsum){
maxsum=sum;
}
}
// minsum of subarray[1...N]
int minsum=0;
sum=0;
for(i=0;i<n;++i){
if(sum+vec[i]>=0){
sum=0;
}else{
sum+=vec[i];
}
if(sum<minsum){
minsum=sum;
}
}
//maxsum start from 0, find the position where sum reach max
sum=0;
int maxi=0;
int pi,pj;
for(i=0;i<n;++i){
sum+=vec[i];
if(sum>maxi){
maxi=sum;
pi=i;
}
}
//maxsum start from N-1, find the position where sum reach max
sum=0;
int maxj=0;
for(i=n-1;i>=0;--i){
sum+=vec[i];
if(sum>maxj){
maxj=sum;
pj=i;
}
}
if(pi<pj)
return max(maxsum,maxi+maxj);
else
return max(maxsum,sumtotal-minsum);

}
int main()
{
vector<int> vec;
int n,x,i;
while(cin>>n){
for(i=0;i<n;++i){
cin>>x;
vec.push_back(x);
}
cout<<solve(vec)<<endl;
vec.clear();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: