RMQ 区间最值问题
今天学弟在群里直播讲课,讲了RMQ, 以前摸鱼太多这个题目并没看出来是啥 ,然后就去凑了个热闹。 RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题。 对于这个问题,区间最值,多次查询,我第一反应是线段树,也确实是线段树最值问题的基础模型,线段树博客其他文章中有,这里不单独拿出来了。 学弟讲这个题目,讲了3中方法暴力、动态规划,ST(Sparse Table) 暴力: 没什么好说 int RMQ(int A[], int mi, int ma) { int rt_max = -INF, rt_min = INF; for(int i=mi; i<=ma; i++) { rt_max = max(A[i], rt_max); rt_min = min(A[i], rt_min); } return {...}; } 动态规划: dp[i][j]维护为从i到j的最大值或最小值,状态转移方程即: dp[i][j]=max(dp[i][j-1],dp[j][j]); 这样在最开始将所有的值全部进行预处理,每次查询只要查询dp[i][j]的值,就能直接得到A[i]-A[j]的最大值和最小值: int dp[MX]