1. 程式人生 > >第八章部分例題分治法

第八章部分例題分治法

相等 std urn tdi 治法 第八章 for sum color

分解問題,遞歸求解,合並解

分成盡量相等的兩部分

分別求出完全位於左邊的序列和右邊的序列

合並即在求出起點位於左邊,終點位於右邊的序列然後與左右的最優解比較

時間復雜度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; }

第八章部分例題分治法