C++的RMQ的代码实现

来源:互联网 发布:离线背单词软件 编辑:程序博客网 时间:2024/05/22 05:33
/*   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;}

原创粉丝点击