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

来源:互联网 发布:淘宝新开店铺采集 编辑:程序博客网 时间:2024/06/05 08:49


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

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

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

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


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

#include<iostream>using namespace std;#define N 8int 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);}


1 0