四种求最大子序列和问题的解

来源:互联网 发布:lr推荐算法 编辑:程序博客网 时间:2024/06/08 01:27
#include<iostream>#include<vector>using namespace std;int maxSubSum1(const vector<int> &a){int maxSum=0;/*记录最大子集和*//*枚举所有出现的子集*/for(int i=0;i!=a.size();i++)/*保证n趟遍历*/{for(int j=i;j!=a.size();j++)/*保证每趟遍历起始地址*/{int thisSum=0;/*一趟枚举的子集和*/for(int k=i;k<=j;k++)/*每趟遍历,起始与结束地址*/{thisSum+=a[k];if(thisSum>maxSum)maxSum=thisSum;/*更新最大值*/}}}return maxSum;}int main(){int a[]={4,-3,5,-2,-1,2,6,-2};size_t size=sizeof(a)/sizeof(int);vector<int> vec(a,a+size);cout<<maxSubSum1(vec)<<endl;return 0;}

#include<iostream>#include<vector>using namespace std;int maxSubSum2(const vector<int> &a){int maxSum=0;/*记录最大子集和*/for(int i=0;i!=a.size();i++){int thisSum=0;for(int j=i;j!=a.size();j++){thisSum+=a[j];if(thisSum>maxSum)maxSum=thisSum;}}return maxSum;}int main(){int a[]={4,-3,5,-2,-1,2,6,-2};size_t size=sizeof(a)/sizeof(int);vector<int> vec(a,a+size);cout<<maxSubSum2(vec)<<endl;return 0;}

#include<iostream>#include<vector>using namespace std;int max3(int a,int b,int c){int max;if(a>b)max=a;elsemax=b;return max>c?max:c;}int maxSumRec(const vector<int> & a,int left,int right){/*基准情况*/if(left==right)if(a[left]>0)return a[left];elsereturn 0;/*分,左半,右半,中间三种情况*/int center=(left+right)/2;int maxLeftSum=maxSumRec(a,left,center);int maxRightSum=maxSumRec(a,center+1,right);int maxLeftBorderSum=0,leftBorderSum=0;for(int i=center;i>=left;i--){leftBorderSum+=a[i];if(leftBorderSum>maxLeftBorderSum)maxLeftBorderSum=leftBorderSum;}int maxRightBorderSum=0,RightBorderSum=0;for(int i=center+1;i<=right;i++){RightBorderSum+=a[i];if(RightBorderSum>maxRightBorderSum)maxRightBorderSum=RightBorderSum;}/*治*/return max3(maxLeftSum,maxRightSum,maxLeftBorderSum+maxRightBorderSum);}int main(){int a[]={4,-3,5,-2,-1,2,6,-2};size_t size=sizeof(a)/sizeof(int);vector<int> vec(a,a+size);cout<<maxSumRec(vec,0,size-1)<<endl;return 0;}

#include<iostream>#include<vector>using namespace std;int maxSubSum4(const vector<int> & a){int maxSum=0,thisSum=0;for(int i=0;i!=a.size();i++){thisSum+=a[i];if(thisSum<0)thisSum=0;if(thisSum>maxSum)maxSum=thisSum;}return maxSum;}int main(){int a[]={4,-3,5,-2,-1,2,6,-2};size_t size=sizeof(a)/sizeof(int);vector<int> vec(a,a+size);cout<<maxSubSum4(vec)<<endl;return 0;}

原创粉丝点击