rmq这个东西其实是可以用线段树来实现的但是毕竟rmq代码简单嘛
算法思路就是dp所以我们要开一个dp的全局变量
dp[i][j]就是以i开头长度为2^j的一段中最大的值
那么很容易的我们就可以推出状态转移方程
dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
把dp数组求出来后我们就可以进行查询了,查询的方法就见代码了啊
初始化代码:
void rmq_init(int *a,int len)
{
for(int i=1;i<=len;i++)
dp[i][0]=a[i];
for(int j=1;(1<<j)<=len;j++)
for(int i=1;i+(1<<j)-1<=len;i++)
dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
查询代码
int rmq(int l,int r)
{
int len=r-l+1;
int k(0);
while((1<<(k+1))<=len)
k++;
int ans;
//printf("%d %d %d %d\n",l,l+(1<<k),r-(1<<k),r-(1<<k)+(1<<k));
if (dp[l][k]>dp[r-(1<<k)+1][k])
ans=dp[l][k];
else ans=dp[r-(1<<k)+1][k];
return ans;
}
注意!那个a数组一定要是从1开始的哦