(RMQ)Range Minimum/Maximum Query区间最值问题算法

RMQ适用范围:给定区间,求最值。


(RMQ)Range Minimum/Maximum Query区间最值问题算法_第1张图片
RMQ最大值图示

预处理(构造):
对于第0行:存取范围为j~j的数字(本身)
对于第1行:存取范围为j~j+2^i-1的最大值(范围为2)
dp[i][j]=max(dp[i-1][j],dp[i-1][j+(2^(i-1))])
对于第2行:存取范围为j~j+2^i-1的最大值(范围为4)
dp[i][j]=max(dp[i-1][j],dp[i-1][j+(2^(i-1))])
对于第3行:存取范围为j~j+2^i-1的最大值(范围为8)
dp[i][j]=max(dp[i-1][j],dp[i-1][j+(2^(i-1))])

void RMQ(int n)
{
    int i, j;
    for(i=1; (1<

询问:

int Find(int l, int r)
{
    int k=0;
    while((1<<(k+1)) <= (r-l+1)) k++;
    return max(dp[k][l],dp[k][r-(1<

例题:https://vjudge.net/contest/160175#problem/O
输入n个数字,m个询问,每个询问给定区域l,r输出该区域的最小值。

#include
#include
using namespace std;

int dp[21][1000005];
void RMQ(int n)
{
    int i, j;
    for(i=1; (1<

你可能感兴趣的:((RMQ)Range Minimum/Maximum Query区间最值问题算法)