您的位置:首页 > 其它

【51Nod】1174 区间中最大的数

2017-05-30 23:37 246 查看

题意

给出一个有N个数的序列,编号0 - N - 1。进行Q次查询,查询编号i至j的所有数中,最大的数是多少。

例如: 1 7 6 3 1。i = 1, j = 3,对应的数为7 6 3,最大的数为7。(该问题也被称为RMQ问题)

解题思路

RMQ经典问题

参考代码

#include <iostream>
using namespace std;
const int MAXN = 10010;
int dp[MAXN][20];
int mm[MAXN];
void initRMQ(int n, int b[])
{
mm[0] = -1;
for (int i = 1; i <= n; i++)
{
mm[i] = ((i & (i - 1)) == 0) ? mm[i - 1] + 1 : mm[i - 1];
dp[i][0] = b[i];
}
for (int j = 1; j <= mm
; j++)
{
for (int i = 1; i + (1 << j) - 1 <= n; i++)
{
dp[i][j] = max(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]);
}
}
}
int rmq(int x, int y)
{
int k = mm[y - x + 1];
return max(dp[x][k], dp[y - (1 << k) + 1][k]);
}

int main(int argc, const char * argv[])
{
int N;
cin >> N;
int b[MAXN];
for (int i = 1; i <= N; i++)
{
cin >> b[i];
}
initRMQ(N, b);
int Q;
cin >> Q;
int
4000
left, right;
for (int i = 0; i < Q; i++)
{
cin >> left >> right;
cout << rmq(left + 1, right + 1) << '\n';
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: