算法_分治法求最大子数组

原创 2016年10月01日 11:51:31


1.分治策略思想在于复杂的问题分解为简单的子问题进行求解

2.最大子数组问题为从给出的数值型数组中提取出一个连续的总值最大的子数组。

3.将一些问题抽象为最大子数组问题并加以解决在现实中是非常实用的

  比如,我们想从一段时间的股票价格变化曲线图中计算出其买进股票和卖出股票的最佳时机时可转换为最大子数组问题。首先我们将曲线图数据提取为一个数组,数组的每个元素值为对应日期相对于前一天的股票差值。求出最大的子数组即为回报值(正盈负亏)。


*最大子数组问题的求解方法只有在数列中同时存在正数和负数的时候才有意义。

#include<iostream>
using namespace std;
#define N 8
int max_subarray(int count,int * arr)
{
	
	if (count == 1)
		return arr[0]<0?0:arr[0];
	else
	{
		//递归求出左边最大值
		int left_bigestsum= max_subarray(count / 2, arr);
		//递归求出右边最大值
		int right_bigestsum= max_subarray(count - count / 2, &(arr[count/2]));
	
		//以中间为轴求出两边最大值并相加,等于过中间元素的最大数组值
		int mlsum = 0,mrsum=0, sum = 0;
		for (int i = count / 2; i>=0; i--)
		{
			sum += arr[i];
			if (sum >= mlsum)
				mlsum = sum;
		}
		sum = 0;
		for (int i = 1+count/2; i <count; i++)
		{
			sum += arr[i];
			if (sum >= mrsum)
				mrsum = sum;
		}

		//比较三种情况中的最大值,并返回
		return (mlsum + mrsum) > (left_bigestsum > right_bigestsum ? left_bigestsum : right_bigestsum) ? mlsum + mrsum : (left_bigestsum > right_bigestsum ? left_bigestsum : right_bigestsum);
	}
}

int main()
{
	int data[N];
	for (int i = 0; i < N; i++)
	cin >> data[i];

	cout << max_subarray(N,data);
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

股票最大收益问题及数组最大差值问题

股票最大收益问题

分治法求数组最大最小数

又是一年好时光要过去,作为刚刚报名蓝桥杯的我开始学习一些算法知识,希望积少成多,在明年4月份的时候可以积累到一定的水平.同时也感谢韦佳栋和杜帅两个基友.不然作为非计算机院的我都不知道还有一个比赛叫蓝桥...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

「算法导论」:分治法求最大子数组

时间复杂度:o(nlgn)

《github一天一道算法题》:分治法求数组最大连续子序列和

看书、思考、写代码! /*************************************** * copyright@hustyangju * blog: http://blog.c...

最大子数组问题:分治法

  • 2014年05月31日 22:33
  • 103KB
  • 下载

分治法求最大子串

最近在学分治法,涉及到很多问题都能用分治法解决,汉诺塔,快排,归并排序等,下面是解决最大字串问题。1,用分治法解决,下面还介绍不用分治解决的另一种方法。...

用分治法求最大子序列问题,时间复杂度O(N*logN)

package Test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream...

采用分治法求最大子列

数据结构第一个编程题:用分治法求最大子列(参考陈越《数据结构》) 代码如下: #include /* Name: get the maxsubsequence Copyright: Auth...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法_分治法求最大子数组
举报原因:
原因补充:

(最多只允许输入30个字)