【C++】数组的最大子数组

前端之家收集整理的这篇文章主要介绍了【C++】数组的最大子数组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我已无法用语言来描述递归有多牛逼。

 

 

 

 

#include<iostream>
#include@H_403_23@<vector>
#include@H_403_23@<algorithm>
using@H_403_23@ namespace@H_403_23@ std;
@H_403_23@int@H_403_23@ max_sub_array(vector<int@H_403_23@>& data,int@H_403_23@ left,1)">int@H_403_23@ right);
@H_403_23@int@H_403_23@ max_crossing_sub_array(vector<int@H_403_23@ mid,1)"> right);


@H_403_23@ main()
{

    vector@H_403_23@<int@H_403_23@> data = { 3@H_403_23@,0@H_403_23@,1)">5@H_403_23@,1)">2@H_403_23@,1)">7@H_403_23@,1)">8@H_403_23@,1)">9@H_403_23@,1)">6@H_403_23@,1)">1@H_403_23@ };
    @H_403_23@//@H_403_23@获取序列元素个数@H_403_23@
    int@H_403_23@ length = 9@H_403_23@;
    @H_403_23@int@H_403_23@ left = 0@H_403_23@int@H_403_23@ right = 8@H_403_23@int@H_403_23@ sum = ;
    sum @H_403_23@= max_sub_array(data,left,right);
    cout @H_403_23@<< sum << "@H_403_23@   "@H_403_23@;
}

@H_403_23@int@H_403_23@> &data,1)"> right)
{
    @H_403_23@if@H_403_23@ (left >= right)因为这个时候表示已经分解到只剩一个元素了,就是递归的终止条件,子数组的最大值就是元素本身,返回@H_403_23@
    {
        @H_403_23@return@H_403_23@ data[left];
    }
    @H_403_23@else@H_403_23@
    {
        @H_403_23@将序列一分为二获取中间位置@H_403_23@
        int@H_403_23@ mid = (left + right) / 2@H_403_23@;
        @H_403_23@int@H_403_23@ max_left,max_right,max_cross,Smax;用来存储子数组的和
        @H_403_23@分治@H_403_23@
        max_left = max_sub_array(data,mid);左边子数组的和@H_403_23@
        max_right = max_sub_array(data,mid + 1@H_403_23@,right);右边子数组的和
        @H_403_23@合并@H_403_23@
        max_cross = max_crossing_sub_array(data,mid,1)">跨越中心的子数组的和@H_403_23@
        Smax = max(max(max_left,max_right),max_cross);
        @H_403_23@ Smax;
    }
}

@H_403_23@int@H_403_23@ left_max = -99999@H_403_23@;不可能达到的一个数@H_403_23@
    int@H_403_23@ right_max = -99999@H_403_23@/*@H_403_23@计算以mid结尾的最大的子数组和,左边子数组@H_403_23@*/@H_403_23@
    for@H_403_23@ (int@H_403_23@ i = mid; i >= left; --i) {
        sum @H_403_23@+= data.at(i);
        @H_403_23@if@H_403_23@ (sum > left_max)
            left_max @H_403_23@= sum;
    }
    sum @H_403_23@= 计算以mid+1开始的最大的子数组和,右边子数组@H_403_23@int@H_403_23@ i = mid + 1@H_403_23@; i <= right; ++ right_max)
            right_max @H_403_23@= sum;
    }
    @H_403_23@return@H_403_23@ left_max + right_max;
}@H_403_23@

 

猜你在找的算法相关文章