博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构:二维ST表
阅读量:5094 次
发布时间:2019-06-13

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

POJ2019

我们其实是很有必要把ST算法拓展到二维的,因为二维的RMQ问题还是不少的

int N,B,K;int mm[505];int val[maxn][maxn];int dpmin[maxn][maxn][8][8];int dpmax[maxn][maxn][8][8];

这里的N是方阵的长宽,此处是正方形题目,然后mm是预处理出来的,方便计算指数

dpmin和dpmax就是预处理数组了

然后看一下开局预处理:

void initRMQ(int n,int m){    for(int i=1;i<=n;i++)    for(int j=1;j<=m;j++)        dpmin[i][j][0][0]=dpmax[i][j][0][0]=val[i][j];    for(int ii=0;ii<=mm[n];ii++)    for(int jj=0;jj<=mm[m];jj++)    if(ii+jj)    for(int i=1;i+(1<
<=n;i++) for(int j=1;j+(1<
<=m;j++) { if(ii) { dpmin[i][j][ii][jj] = min(dpmin[i][j][ii-1][jj],dpmin[i+(1<<(ii-1))][j][ii-1][jj]); dpmax[i][j][ii][jj] = max(dpmax[i][j][ii-1][jj],dpmax[i+(1<<(ii-1))][j][ii-1][jj]); } else { dpmin[i][j][ii][jj] = min(dpmin[i][j][ii][jj-1],dpmin[i][j+(1<<(jj-1))][ii][jj-1]); dpmax[i][j][ii][jj] = max(dpmax[i][j][ii][jj-1],dpmax[i][j+(1<<(jj-1))][ii][jj-1]); } }}

我们看预处理的时候还是比较明朗的,当然别忘了在主函数把mm初始化好

mm[0]=-1;    for(int i=1;i<=500;i++)        mm[i]=((i&(i-1))==0)?mm[i-1]+1:mm[i-1];

然后就是求最大值和最小值的函数了,这里,一定要仔细地去写,很容易写错:

int rmq1(int x1,int y1,int x2,int y2)  //max{    int k1=mm[x2-x1+1];    int k2=mm[y2-y1+1];    x2=x2-(1<

这个式子确实很长的

最后给出题目完整的实现:

1 #include
2 #include
3 using namespace std; 4 const int maxn=255; 5 int N,B,K; 6 int mm[505]; 7 int val[maxn][maxn]; 8 int dpmin[maxn][maxn][8][8]; 9 int dpmax[maxn][maxn][8][8];10 void initRMQ(int n,int m)11 {12 for(int i=1;i<=n;i++)13 for(int j=1;j<=m;j++)14 dpmin[i][j][0][0]=dpmax[i][j][0][0]=val[i][j];15 for(int ii=0;ii<=mm[n];ii++)16 for(int jj=0;jj<=mm[m];jj++)17 if(ii+jj)18 for(int i=1;i+(1<
<=n;i++)19 for(int j=1;j+(1<
<=m;j++)20 {21 if(ii)22 {23 dpmin[i][j][ii][jj] = min(dpmin[i][j][ii-1][jj],dpmin[i+(1<<(ii-1))][j][ii-1][jj]);24 dpmax[i][j][ii][jj] = max(dpmax[i][j][ii-1][jj],dpmax[i+(1<<(ii-1))][j][ii-1][jj]);25 }26 else27 {28 dpmin[i][j][ii][jj] = min(dpmin[i][j][ii][jj-1],dpmin[i][j+(1<<(jj-1))][ii][jj-1]);29 dpmax[i][j][ii][jj] = max(dpmax[i][j][ii][jj-1],dpmax[i][j+(1<<(jj-1))][ii][jj-1]);30 }31 }32 }33 int rmq1(int x1,int y1,int x2,int y2) //max34 {35 int k1=mm[x2-x1+1];36 int k2=mm[y2-y1+1];37 x2=x2-(1<

转载于:https://www.cnblogs.com/aininot260/p/9379833.html

你可能感兴趣的文章
Django项目:CRM(客户关系管理系统)--41--33PerfectCRM实现King_admin编辑整张表限制
查看>>
关于时间
查看>>
面向对象 阶段性总结
查看>>
[Android] 开发第十天
查看>>
[html]window.open 使用示例
查看>>
.NET下使用socket.io随笔记录
查看>>
操作~拷贝clone()
查看>>
通过this()调用有参构造方法
查看>>
【RN6752】模拟高清AHD芯片或成为车机新标配
查看>>
Android Clipboard(复制/剪贴板)
查看>>
Android中Bitmap,byte[],Drawable相互转化
查看>>
UEFI引导修复教程和工具
查看>>
Using True Type Fonts in XTerm
查看>>
文件读写
查看>>
【转】Linq 求和,求平均值,求最大,求最小,分组,计数
查看>>
关于调整input里面的输入光标大小
查看>>
asp.net实现页面无刷新效果
查看>>
学习总结 for循环语句的应用
查看>>
简聊REST风格
查看>>
php在web服务器中的工作原理
查看>>