算法导论--分治策略求解最大子数组问题

#include<iostream>
#include<string>
#include<memory.h>
#include<cstdio>
#include<string>
#define NUM 305
using namespace std;


int charaNum[NUM]  ;
char arr[NUM];
int max_left = 0;
int max_right = 0;

int find_max_crossing_subarray(int * disPrice,int low ,int mid , int high)
{
    int left_sum = -1;
    int right_sum = -1;
    int sum = 0;
    for(int i = mid;i>=low;i--)
    {
        sum += disPrice[i];
        if(sum>left_sum)
        {
            left_sum = sum;
            max_left = i;
        }
    }
    sum = 0;
    for(int i = mid+1;i<=high;i++)
    {
        sum+=disPrice[i];
        if(sum>right_sum)
        {
            right_sum = sum;
            max_right = i;
        }
    }
    return left_sum+right_sum;
}

int find_maximum_subarray(int * disPrice,int low,int high)
{
    if(low==high)
        return  disPrice[low];
    else
    {
        int mid = (low+high)/2;
        int left_max = find_maximum_subarray(disPrice,low,mid);
        int right_max = find_maximum_subarray(disPrice,mid+1,high);
        int cross_max = find_max_crossing_subarray(disPrice,low,mid,high);
        if(left_max>=right_max && left_max>=cross_max)
            return left_max;
        else if(right_max >=left_max && right_max >= cross_max)
            return right_max;
        else
            return cross_max;
    }
}

int main()
{
    freopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);
    memset(charaNum,0,sizeof(charaNum));
    int num;
    while (cin>>num)
    {
        for(int i = 0;i<num;i++)
        {
            cin>>charaNum[i];
        }
        int * disPrice = new int[num-1];
        for(int i = 0;i<num-1;i++)
        {
            disPrice[i] = charaNum[i+1]-charaNum[i];
        }
       int maxSum =  find_maximum_subarray(disPrice,0,num-2);
        cout<<maxSum<<endl;
        cout<<max_left<<" "<<max_right<<endl;
        delete[] disPrice;
    }
}

输入:

17
100 113 110 85 105 102 86 63 81 101 94 106 101 79 94 90 97

输出:

43
7 10

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值