第八章部分例题分治法
分解问题,递归求解,合并解
分成尽量相等的两部分
分别求出完全位于左边的序列和右边的序列
合并即在求出起点位于左边,终点位于右边的序列然后与左右的最优解比较
时间复杂度O(nlogn)
#include <cstdio> #include <iostream> #include <algorithm> using namespace std; const int maxn=100; int A[maxn]; int maxsum(int* A,int x,int y) { if(y==x+1) return A[x]; int m=x+(y-x)/2; int maxs=max(maxsum(A,x,m),maxsum(A,m,y)); int L=A[m-1],v=0; for(int i=m-1;i>=x;i--) L=max(L,v+=A[i]); int R=A[m]; v=0; for(int i=m;i<y;i++) R=max(R,v+=A[i]); return max(maxs,L+R); } int main() { int x=0; int y; cin>>y; for(int i=0;i<y;i++) cin>>A[i]; int best=maxsum(A,x,y); printf("%d\n",best); return 0; }
Yosoro