原题链接:蓝桥杯算法提高VIP-和最大子序列
解题思路: 1.以中间的元素为界限,把子串划分为三种情况:一。左边到中间,二。右边到末尾 这两种可以递归解决! 三。中间的左右都有一部分,然后相加。
注意事项:
第三种情况必须用临时的左右和存储值,不然会出错
参考代码:
#include<iostream> using namespace std; const int maxsize=100001; int N; int MaxSum(int a[],int left,int right){ int s1,s2,s,sum=0,midsum=0,m,lsum=0,rsum=0; int l=left,r=right; int ls,rs;//临时存放第三种情况左右序列的和 if(l==r) sum=a[l]; else { m=(r-l)/2+l; lsum=MaxSum(a,l,m);//第一种情况 左边到中间的和 rsum=MaxSum(a,m+1,r); //第二种情况 中间到右边的和 //第三种情况的话分左右子序列 s1=0,ls=0; for(int i=m;i>=l;i--){ ls+=a[i]; //寻找左边子序列最大和 if(ls>s1) s1=ls; } s2=0,rs=0; for(int j=m+1;j<=r;j++){ rs+=a[j]; //寻找右边子序列最大和 if(rs>s2) s2=rs; } midsum=s1+s2; if(midsum>lsum) sum=midsum; else sum=lsum; if(sum<rsum) sum=rsum; } return sum; } int main(){ int A[maxsize]; cin>>N; for(int i=0;i<N;i++) cin>>A[i]; cout<<MaxSum(A,0,N-1); return 0;}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复