首尾相连数组的最大子数组和
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);
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; }
相关文章推荐
- 首尾相连的一维数组中连续子数组最大和
- 九度 1527:首尾相连数组的最大子数组和
- JD 1527:首尾相连数组的最大子数组和
- 淘宝2013面试题-求首尾相连数组的最大子数组和
- 编程之美---求首尾相连数组子数组之和的最大值
- 首尾相连的一位数组最大子数组和
- 题目1527:首尾相连数组的最大子数组和
- 首尾相连的循环数组求其子数组最大值
- 返回一个首尾相连的整数数组中最大子数组的和
- 首尾相连一维数组的最大子数组和
- 首尾相连数组的最大子数组和 淘宝面试题
- 南阳理工OJ_题目745 蚂蚁的难题(二)&&题目983 首尾相连数组的最大子数组和
- 九度OJ 1527 首尾相连数组的最大子数组和
- 体验结对开发的乐趣(4)--(首尾相连的一维数组求最大子数组和的问题)
- 最大子数组和(首尾相连)
- 求首尾相连数组的最大子序列和
- 首尾相连的二维数组求最大字数组的和
- NYOJ 983 首尾相连数组的最大子数组和
- 九度Online Judge_1527: 首尾相连数组的最大子数组和
- NYOJ983-首尾相连的最大子数组和(升级版子数组和)