`
## 分治策略01
分治策略的关键是要确定基准条件和子问题与子问题之间的联系关系,通过这种联系关系
实现最小问题向上求解。
给定序列Ai,...Aj,找到满足对于i<k<j的Ak大于Ai小于Aj且j-i最大的i与j,
如果没找到则输出两个-1。
首先判断Ai,Aj与Amax、Amin的关系:
第一种情况是当Ak介于Amin和Amax中间,
那么此时i≤minindex≤k≤maxindex;
第二种情况是A1,A2,...,Amax,Ai,...Ak,Amin,...Aj;
主要复杂的是第二种情况,将初始位置begin与结束位置end分别与最近的元素去考虑,
而这个最近主要体现在maxindex<minindex
有begin ..... maxindex .....minindex.....end(对begin与maxindex进行递归,
maxindex与minindex进行递归,对end与minindex进行递归)
//给定序列Ai,...Aj,找到满足对于i<k<j的Ak大于Ai小于Aj且j-i最大的i与j,如果没找到则输出两个-1;
#include<stdio.h>
int a[100001];//store index value
int L=0;//subscript difference of index length
int begin=0;//begin subscript
int end=0;//end subcript
int n=0;//index length
void getL(int b,int e){
int i=1,l=-1;
int min,max;
int minindex,maxindex;
min=1000000;
max=-1;
minindex=maxindex=0;
if(b>=0&&e<n&&(e-b)>1)
{
for(i=b;i<=e;i++)
{
if(a[i]<min)
{
min=a[i];
minindex=i;
}
if(a[i]>max)
{
max=a[i];
maxindex=i;
}
}
}
if((maxindex-minindex)>L)
{
L=maxindex-minindex;
begin=minindex;
end=maxindex;
}
if(maxindex>minindex)
{
if((minindex-1)>b) getL(b,minindex-1);
if((maxindex+1)<e) getL(maxindex+1,e);
}
else{
if(maxindex>b) getL(b,maxindex);
if((minindex-1)>(maxindex+1)) getL(maxindex+1,minindex-1);
if(minindex<e) getL(minindex,e);
}
}
int main()
{
int i;
while(scanf("%d",&n)!=EOF){
L=0;
begin=0;
end=0;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
getL(0,n-1);
if(L==0) printf("-1 -1\n");
else printf("%d %d\n",begin+1,end+1);
}
return 0;
}