RMQ问题:区间最小值问题(也可以解决区间最大值问题)
解决算法:ST (Sparse - Table算法,基于动态规划求区间最值的算法)
ST算法分为预处理和查询两部分
首先定义数组:我们用定义 Amax[i][j] 为从 i开始的,长度为2^j的区间里面的最大值, Amin[i][j]为从i开始,长度为2^j的区间里面的最小值
一:预处理如下
我们可以将一段长度为2^j的区间分成两段长度都为2^(j-1)的相同区间
区间1 为 i.....i+2^(j-1)-1 区间2为 i+2^(j-1).....i+2^j-1
得到状态转移方程(由长度递增推出)
Amax[i][j] = max(Amax[i][j-1], Amax[i+2^(j-1)][j-1])
Amin[i][j] = max(Amin[i][j-1], Amin[i+2^(j-1)][j-1])边界条件为F[i][0]=A[i].
二:查询如下
MAX L R 表示要查询[L, R]区间的最大值
MIN L R 表示要查询[L, R]区间的最小值