约束rmq_『数据结构』RMQ问题(示例代码)

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][*])</

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值