这里用分治的方法
分成两半,左边一半,右边一半,递归求解。
#include <iostream>
using namespace std;
#define MAXN 1000000
int A[MAXN + 1];
long long ans;
int maxdepth=-1;
int countnumber = 0;
void CAL(int lef, int rig) //产生W结构时且W中点大于任一端点则分治,否则直接计算
{
int L_max = A[lef], R_max = A[rig], MAX = -20, LOC_max = 0;
for (int i = lef + 1; i <= rig - 1; i++)
if (MAX < A[i])
{
MAX = A[i]; LOC_max = i;
}
LOC_max = (A[LOC_max] >= L_max || A[LOC_max] >= R_max) ? LOC_max : 0;
if (LOC_max)
{
CAL(lef, LOC_max);
CAL(LOC_max, rig);
return; }
else
{
int ave = min(A[lef], A[rig]);
countnumber++;
for (int i = lef + 1; i <= rig - 1; i++)
if (maxdepth < ave - A[i])
{
maxdepth = ave - A[i];
}
}
return;
}
int main()
{
int N=0,j=0;
cin >> N;
int lef=1, rig=N;
for (j = 1; j <= N; j++) cin>>A[j];
for (j = 1; j <= N && A[j] <= A[j + 1]; j++) lef = j + 1;//去掉左端递增项
for (j = N; j >= 1 && A[j] <= A[j - 1]; j--) rig = j;//去掉右端递减项
ans = 0;
CAL(lef, rig);
cout << countnumber-1<<endl;
cout << maxdepth << endl;
return 0;
}