首页 > 代码库 > 最大子段和(分治法)
最大子段和(分治法)
#include <iostream>#include <algorithm>#include <cstdio>#include <cstring>#include <map>#define N 1000005using namespace std;int a[1005];int calc(int s,int e,int &l,int &r){ int l1,l2,l3,r1,r2,r3; if(s==e) return a[s]>0?a[s]:0; int mid=(s+e)>>1; int sum1=calc(s,mid,l1,r1); int sum2=calc(mid+1,e,l2,r2); int sl=0,sr=0,t=0; l3=mid+1; r3=mid; for(int i=mid;i>=s;i--){ t+=a[i]; if(sl<t) sl=t,l3=i; } t=0; for(int i=mid+1;i<=e;i++){ t+=a[i]; if(sr<t) sr=t,r=i,r3=i; } int ss=sl+sr; l=l3,r=r3; if(ss<sum1) ss=sum1,l=l1,r=r1; if(ss<sum2) ss=sum2,l=l2,r=r2; return ss;}int main(){ int n; printf("输入数列长度:"); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); int l,r; int sum=calc(1,n,l,r); if(sum>0){ cout<<"最大子段和:"<<sum<<endl; cout<<"起点和终点:"<<l<<" "<<r<<endl; } else { cout<<"最大子段和:"<<sum<<endl; cout<<"无起点和终点!"<<endl; } return 0;}
最大子段和(分治法)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。