#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