蓝桥杯备赛(7):ST表

RMQ问题

RMQ问题是针对于数组,每次给一个区间[l,r],要求返回区间内的最大值或最小值(的下标),也就是说,RMQ问题就是求区间最值的问题。

对于RMQ问题,容易想到一种O(n)的方法,就是用i直接遍历[l,r]区间,不断比较a[i]与max的大小关系,然后不断更新max,最后得出的就是最大值。

但是,我们可以利用倍增和动态规划的思想,利用“ST表”这个数据结构来帮助解决。

ST表

ST表是一种可以“静态求区间最值”的数据结构,本质上是一种dp

假设求区间最大值(最小值),状态表示:dp[i][j]表示从i开始,大小为2^j的长度的区间的最大值,即区间[i,i+2^j-1]的最大值。

状态转移方程:dp[i][j]=max(dp[i][i-1],dp[i+(1<<(j-1))[j-1]);(注意:状态转移的方向和区间合法)

代码模板:

int getMax(int l, int r) {
	int k = log(r - 1 + 1) / log(2);
	return max(dp[i][k], dp[r - (1 << k) + 1][k]);
}

你可能感兴趣的:(蓝桥备赛,蓝桥杯,贪心算法,c++,c语言,数据结构,动态规划)