问题:

  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的整数次幂

最新文章

  1. 如何使用dos命令查看MySQL当前使用的数据库?
  2. Oracle 哈希连接原理
  3. Wix 安装部署教程(七) 获取管理员权限
  4. 编译原理(简单自动词法分析器LEX)
  5. c# 多线程系列二 自定义线程执行器
  6. Visual Studio 2012中Visual Assist破解办法
  7. RMAN_学习笔记2_RMAN Setup配置和监控
  8. 错误: 找不到或无法加载主类 Files\apache-activemq-5.10.0\bin\..\conf\login.config
  9. java中如何忽略字符串中的转义字符--转载
  10. 05_Excel操作_02_模拟Web环境的User列表导出
  11. C#Stimulator项目&gt;&gt;&gt;C/C++ DLL的生成和调用,Windows下的多线程
  12. ajax传递json数据,springmvc后台就收json数据
  13. Otacle表查询
  14. POJ 3458 Colour Sequence(简单题)
  15. C#中string的小结
  16. Delphi ADO数据操作封装类
  17. JAVA三大特性之一——封装
  18. java配置环境变量,无法也行javac问题
  19. 转载泡泡机器人——IMU预积分总结与公式推导2
  20. 在浏览器输入URL时发生了什么

热门文章

  1. linux操作系统搭建测试环境
  2. 解决 Windows 编译 Fast R-CNN 的 bbox 和 nms 出现的错误 error: Unable to find vcvarsall.bat
  3. go语言开发工具sublime text3 + gosublime配置
  4. HTML5基础-新增标签+新增属性+布局案例
  5. Electron – 基础学习(2): 项目打包成exe桌面应用 之electron-packager
  6. QD程序设计比赛游记
  7. Gitee Git bash VSCode操作简易说明
  8. JSP数据交互2
  9. 剑指offer-面试题16-数值的整数次方-数字
  10. 产生随机数(rand()函数和srand()函数)