C++的RMQ的代码实现
2017-05-29 17:05
232 查看
/* 1.dp[i][j]表示从i开始长为2的j次方的数组长度,所以他是a[i]~a[i+2^j-1]的数组里的最值。 2.i<<j的意思是:二进制的i往左移j位,等效于i*2^j。 3.用动态规划的办法来构建dp的。 4.每次找dp[i][j]的最值的时候都是拆了一半来找,因为前面已经找了他的一半情况下的最值 dp[i][j]=max(dp[i][j-1],dp[i+(1<<j-1)][j-1]; 5.重点解释下关于dp构建好之后如何查找的问题: 如果我要查找[left,right]中的最值,我先把 int k= right-left+1 ; k=log2k; 然后取dp[left][k],dp[right-(1<<k)+1][k]中的最值 这样不仅使两个dp的范围相交而且保证在[left,right]区间 */ #include<cstdio> #include<iostream> #include<cmath> using namespace std; int dp[101][101]; int a[101]; int main() { //freopen("test.txt","r",stdin); int n; cin>>n; for(int i=1;i<=n;i++) cin>>dp[i][0]; for(int i=1;i<=n;i++) for(int j=1;j+(1<<i)-1<=n;j++) { dp[j][i]=max(dp[j][i-1],dp[j+(1<<(i-1))][i-1]); } int left,right; cin>>left>>right; int k=right-left+1; k=log2(k); int maxnum=max(dp[left][k],dp[right-(1<<k)+1][k]); cout<<maxnum<<endl; return 0; }
相关文章推荐
- 用C/C++实现SMC动态代码加密技术
- 三元组Triplet的C++代码(类)实现
- Singleton模式的C++实现研究(示例代码)
- 在C++下实现的程序拨号代码
- C++基本算法收集及代码实现
- 在JAVA中实现C++代码的复用
- 多边形顺时针方向判断公式及C++代码实现一
- C++ + WMI + DDK 实现获得显卡信息 代码
- Singleton模式的C++实现研究(示例代码)
- 使用C/C++实现Socket聊天程序(代码+实验报告)
- 顺序表SqList的C++代码实现
- 用C/C++实现SMC动态代码加密技术
- Singleton模式的C++实现研究(示例代码)
- 用C/C++实现SMC动态代码加密技术
- 键树的c++代码实现
- Symbian下用C++实现网页浏览的代码
- 单链表的C++代码实现
- 用C/C++实现SMC动态代码加密技术
- Symbian下用C++实现网页浏览的代码
- 使用C/C++实现Socket聊天程序(代码+实验报告)