首尾相连数组的最大子数组和
来源:互联网 发布:开淘宝计划书怎么写 编辑:程序博客网 时间:2024/05/16 15:18
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;}
- 首尾相连数组的最大子数组和
- 首尾相连数组的最大子数组和
- 首尾相连数组的最大子数组和
- 首尾相连数组的最大子数组和
- 首尾相连数组的最大子数组和
- 首尾相连数组的最大子数组和
- 首尾相连数组的最大子数组和
- 首尾相连数组的最大子数组和
- 首尾相连数组的最大子数组和
- 首尾相连数组的最大子数组和
- 数组的连续子数组最大和(首尾相连)
- 单调队列-首尾相连数组的最大子数组和
- 首尾相连数组的最大子数组和【单调队列】
- 题目1527:首尾相连数组的最大子数组和
- 首尾相连数组的最大子数组和 淘宝面试题
- JD 1527:首尾相连数组的最大子数组和
- 九度 1527 首尾相连数组的最大子数组和
- Nyoj 983 首尾相连数组的最大子数组和
- Spring的开始~
- 200个JSP小技巧
- extmail 修改root用户密码
- 友元模板
- C语言全局变量那些事儿
- 首尾相连数组的最大子数组和
- hadoop日志【1】--hive服务和sqoop服务运行
- 处理 CentOS/Linux GLIBCXX_3.4.15 not found error
- 软件测试方法
- 表单提交方式get与post的区别
- C++ 对象的内存布局(下)
- errno.h
- EMOS Fail2Ban设置
- 正确运用stl map的erase方法