RMQ的问题

最近看了rmq,先学的的st算法,实际就是用动态规划来解的。

设状态d[i][j]表示从第i个位置起,2^j个数的最大值。状态转移方程:d[i][j] = max(d[i][j - 1], d[i + (1 << (j - 1))][j - 1]);初始状态d[i][j] = w[i][j](w[i][j]表示要求的数组),复杂度为O(n*logn)的预处理,O(1)的查询,

题目:POJ 3264,可以完全套上面的方程

POJ 3369,预处理的时候加一个处理两个端点的条件,查询也加上

上面的都是一维的情况,也可以处理二维的情况。

题目:POJ 2019 这个题目比较特殊,查询的都是正方形,而且边长固定。可以设d[i][j][k]表示从第i行,第j列位起,2^j为正方形边长的最大值。状态转移方程:d[i][j][k] = max(max(d[i][j][k - 1], d[i + (1 << (k - 1))][j][k - 1]), max(d[i][j + (1 << (k - 1))][k - 1], d[i + (1 << (k - 1))][j + (1 << (k - 1))][k - 1]);));;初始状态d[i][j][0] = w[i][j](w[i][j]表示要求的数组),复杂度为O(n*n*logb)的预处理,O(1)的查询,当然如果不是正方形,还要再加一维,就可以表示行列的长度,复杂度为O(n*n*logb * log(b))。不过很可惜,这道题的规模实在太小,直接暴力也能过。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值