RMQ(区间最值问题)
2024-10-08 09:50:28
问题:
RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题。
dp思想:
dp[i][j]中存储的是从第i个数开始的2j个数最大的数。(如下图)
dp[2][2]表示的是2到2+22-1中最大的数。即下表2-5中最大的数。
如果要求2-7中最大的数,可以先将区间拆成两个2x长度的字串,分别求字串的最大值。2-7可以拆分成2-5和4-7这两个序列长度都为4.所以直接比较dp[2][2]和dp[4][2]即可。
dp代码:
const int maxn=1e5+;
int dp[maxn][];
int vis[maxn]; //处理dp数组
void rmq(int n,int a[]){
vis[]=-;
for(int i=;i<n;i++){
vis[i]=((i&(i-))==)?vis[i-]+:vis[i-];//标记0.0
dp[i][]=a[i];
}
for(int j=;j<=vis[n];j++){
for(int i=;i+(<<j)-<=n;i++){
dp[i][j]=max(dp[i][j-],dp[i+(<<(j-))][j-]);
}
}
}
//查询最大值
int rmpp(int x,int y){
int k=vis[y-x+];
return max(dp[x][k],dp[y-(<<k)+][k]);
}
补充:
上述代码有一个标记,代表此行代码和如下代码功能相同。
int ans=;
vis[]=-;
for(int i=;i<n;i++){
if(i==ans){
ans*=;
vis[i]=vis[i-]+;
}
else vis[i]=vis[i];
}
n&(n-1)可以判断一个数是不是2的整数次幂
最新文章
- 如何使用dos命令查看MySQL当前使用的数据库?
- Oracle 哈希连接原理
- Wix 安装部署教程(七) 获取管理员权限
- 编译原理(简单自动词法分析器LEX)
- c# 多线程系列二 自定义线程执行器
- Visual Studio 2012中Visual Assist破解办法
- RMAN_学习笔记2_RMAN Setup配置和监控
- 错误: 找不到或无法加载主类 Files\apache-activemq-5.10.0\bin\..\conf\login.config
- java中如何忽略字符串中的转义字符--转载
- 05_Excel操作_02_模拟Web环境的User列表导出
- C#Stimulator项目>;>;>;C/C++ DLL的生成和调用,Windows下的多线程
- ajax传递json数据,springmvc后台就收json数据
- Otacle表查询
- POJ 3458 Colour Sequence(简单题)
- C#中string的小结
- Delphi ADO数据操作封装类
- JAVA三大特性之一——封装
- java配置环境变量,无法也行javac问题
- 转载泡泡机器人——IMU预积分总结与公式推导2
- 在浏览器输入URL时发生了什么
热门文章
- linux操作系统搭建测试环境
- 解决 Windows 编译 Fast R-CNN 的 bbox 和 nms 出现的错误 error: Unable to find vcvarsall.bat
- go语言开发工具sublime text3 + gosublime配置
- HTML5基础-新增标签+新增属性+布局案例
- Electron – 基础学习(2): 项目打包成exe桌面应用 之electron-packager
- QD程序设计比赛游记
- Gitee Git bash VSCode操作简易说明
- JSP数据交互2
- 剑指offer-面试题16-数值的整数次方-数字
- 产生随机数(rand()函数和srand()函数)