具体的算法讲解可以看看大神的,个人觉得写得非常好
自己看完写了一下,并没有完全理解透
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
int main()
{
int f[20][20];
int num[20];
int i,j,k;
int n,m;
while (~scanf ("%d",&n))
{
memset(num,0,sizeof(num));
for (i=1; i<=n; i++)
{
scanf ("%d",&num[i]);
f[i][0]=num[i];//初始化f[i][0]
}
for (j=1; j<20; j++)//预处理
{
for (i=1; i<n; i++)
{
if(i+(1<<j)-1<=n)
f[i][j]=max( f[i][j-1],f[ i+(1<<(j-1))][j-1]);
}
}
int x,y;
scanf("%d%d",&x,&y);//查找
int k=(int)(log(y-x+1.0)/log(2.0));
printf("%d\n",max(f[x][k],f[y-(1<<k)+1][k]));
}
}