RMQ(Range Minimum/Maximum Query),即区间最值问题。
对于长度为 n 的数列 A ,回答若干查询 RMQ(A,i,j)(i,j<=n) ,返回数列 A 中下标在 i,j 里的最大(小)值。
相关算法
朴素(搜索),时间复杂度:(O(n)-O(q imes n)) ,在线;
线段树,时间复杂度:$O(n)-O(qimes logn) $,在线;
ST(动态规划),时间复杂度:(O(nimes logn)-O(q)),在线;
RMQ标准算法,先规约为LCA,再规约成约束RMQ ,时间复杂度:(O(n)-O(q)),在线。
ST 算法
假设当前题目要求区间最小值,我们令 dp[i][j] 代表从 i 开始,长度为(2^{j})这段区间的最小值。
于是便有:(dp[i][j]=min(dp[i][j-1],dp[i+^{j-1}][j-1]))
分析可知,(dp[i][j-1])代表从 i 开始,长度为(2^{j})区间一半中的最小值,而 (dp[i+2^{j-1}][j-1])即为区间的另一半。
即为区间的另一半。
最终(从下往上看):
(dp[0][*])
(dp[1][*])
(dp[2][*])
(dp[3][*])
(dp[4][*])
(dp[5][*])
(dp[6][*])
(dp[7][*])</