博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ST表
阅读量:5346 次
发布时间:2019-06-15

本文共 1476 字,大约阅读时间需要 4 分钟。

近期我计划要补更好多noip知识点

就先从ST表开始吧

ST表是一种编程复杂度低的用于求解RMQ问题的算法

算法核心思想运用了动态规划和倍增

以求区间最大值为例

设a[i][j]表示左端点为i ,右端点为i + (2 ^ j) - 1的区间的最大值

显然这段区间的长度为2 ^ j;

然后将这段区间分为两段长度均为2 ^ (j - 1)的子区间

一段为a[i][j - 1],另一端为a[i + 2 ^ (j - 1)][j - 1]

所以原区间的最大值就是两个子区间最大值的较大的值

至此可以写出dp的动态转移方程:

当j == 0时 a[i][0] = 输入的序列中的第i个(即r[i]);

当j > 0时 a[i][j] = max(a[i][j - 1], a[i + 2 ^ (j - 1)][j - 1]);

至于数组a的大小要特殊说明一下

第一维的大小为输入序列的最大长度len

第二维的大小为loglen(一般开到25 ~ 30均可)

接下来上一道例题:

下面是我的代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;const int maxn = 1e6 + 5;int a[maxn][25], n, m;int read(){ int ans = 0, op = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') op = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { ans *= 10; ans += ch - '0'; ch = getchar(); } return ans * op;}void ST(){ for(int i = 1;i <= n;i++) a[i][0] = read(); for(int j = 1;j <= 19;j++) { for(int i = 1;i + (1 << j) - 1 <= n;i++) a[i][j] = max(a[i][j - 1], a[i + (1 << (j - 1))][j - 1]); }}int query(int l, int r){ int k = log2(r + 1 - l); return max(a[l][k], a[r - (1 << k) + 1][k]);//如需求区间最大值则将max改为min }int main(){ int n = read(), m = read(); ST(); while(m--) { int L, R; L = read(), R = read(); printf("%d\n", query(L, R)); } return 0;}

 

转载于:https://www.cnblogs.com/thx666/p/9755106.html

你可能感兴趣的文章
Python之旅Day14 JQuery部分
查看>>
core--线程池
查看>>
redux-effect
查看>>
Android轻量级的开源缓存框架ASimpleCache
查看>>
他山之石:加载图片的一个小问题
查看>>
shell - 常识
查看>>
mssql sqlserver 使用sql脚本 清空所有数据库表数据的方法分享
查看>>
分层图最短路【bzoj2763】: [JLOI2011]飞行路线
查看>>
linux下编译复数类型引发的错误:expected unqualified-id before '(' token
查看>>
codeforces 1041A Heist
查看>>
Spring Cloud Stream消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)
查看>>
bzoj1048 [HAOI2007]分割矩阵
查看>>
Java中的编码
查看>>
PKUWC2018 5/6
查看>>
As-If-Serial 理解
查看>>
洛谷P1005 矩阵取数游戏
查看>>
在Silverlight中使用HierarchicalDataTemplate为TreeView实现递归树状结构
查看>>
无线通信基础(一):无线网络演进
查看>>
如何在工作中快速成长?阿里资深架构师给工程师的10个简单技巧
查看>>
WebSocket 时时双向数据,前后端(聊天室)
查看>>