码迷,mamicode.com
首页 > 其他好文 > 详细

第八章部分例题分治法

时间:2017-09-05 13:26:42      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:bsp   复杂   printf   return   algo   复杂度   blog   col   左右   

分解问题,递归求解,合并解

 

分成尽量相等的两部分

分别求出完全位于左边的序列和右边的序列

合并即在求出起点位于左边,终点位于右边的序列然后与左右的最优解比较

 

时间复杂度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;
}

 

第八章部分例题分治法

标签:bsp   复杂   printf   return   algo   复杂度   blog   col   左右   

原文地址:http://www.cnblogs.com/tclan126/p/7478045.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!