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

分治法

时间:2020-02-21 20:45:18      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:space   str   end   元素   时间复杂度   快速   解决   前缀和   复杂   

分治法的思想:

分治法的思想是分开求解然后合并。分治法的思想在很多算法中都广泛使用,例如二分查找,归并排序,快速排序。

分治法的主要步骤;

1、 划分问题:把问题分为子问题。

2、 递归求解:递归解决问题。

3、 合并问题:合并子问题得到原问题的解。

典型例题:

给出一个数组n的序列A1A2------An,求最大连续和。

 

看到这里,我们不免想到了使用数组前缀和来求解,但在n足够大时,最坏的情况下,时间复杂度为O(n^2);可能会超时。但是使用分治法,时间复杂度为n*log2(n

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=10010;
int a[N];
int n,sum;

int maxsum(int x,int y)
{
	//printf("11\n");
	if(y-x==1) return a[x]; //只有一个元素直接返回
	int v,L,R,maxs;
	int m=x+(y-x)/2;  //划分区间为[x,m)和[m,y); 
    maxs=max(maxsum(x,m),maxsum(m,y)) ;//递归求解
	v=0;L=a[m-1]; 
	for(int i=m-1;i>=x;i--) L=max(L,v+=a[i]);  //合并(1)———从分界点到左的最大连续和 
    v=0;R=a[m];
	for(int i=m;i<y;i++) R=max(R,v+=a[i]);    //合并(2)———从分界点到右的最大连续和
	return  max(maxs,L+R);  //把子问题的解与L和R比较 
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	cout<<maxsum(1,n+1)<<endl;
	return 0; 
}

  

分治法

标签:space   str   end   元素   时间复杂度   快速   解决   前缀和   复杂   

原文地址:https://www.cnblogs.com/tqll/p/12342684.html

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