写了几道题之后才敢来瞎bb
RMQ (Range Minimum/Maximum Query)问题是指:
对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,RMQ问题是指求区间最值的问题。
for循环遍历一边,然后输出,那么你很容易想到会被T飞掉;
1、先写一种比较高效的ST算法解决这个问题。
ST(Sparse Table)算法可以在O(nlogn)时间内进行预处理,然后在O(1)时间内回答每个查询。
其实ST表是一种动态规划的思想;每次运用倍增求解每一个区间;
定义:f(i,j)表示[i,i+2j−1]这段长度为2j的区间中的最大值。
预处理:f(i,0)=ai。即[i,i][i,i]区间的最大值就是ai。
状态转移:将[i,j]平均分成两段,一段为[i,i+2j−1−1],另一段为[i+2j−1,i+2j−1]。
两段的长度均为2j−1。f(i,j)的最大值即这两段的最大值中的最大值。
得到f(i,j)=max{f(i,j−1),f(i+2j−1,j−1)};
查询:
摘来大佬的题解;
原文:https://www.cnblogs.com/Tyouchie/p/10706243.html